1fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 2750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Redistribution and use in source and binary forms, with or without 3750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// modification, are permitted provided that the following conditions are 4750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// met: 5750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// 6750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// * Redistributions of source code must retain the above copyright 7750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// notice, this list of conditions and the following disclaimer. 8750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// * Redistributions in binary form must reproduce the above 9750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// copyright notice, this list of conditions and the following 10750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// disclaimer in the documentation and/or other materials provided 11750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// with the distribution. 12750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// * Neither the name of Google Inc. nor the names of its 13750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// contributors may be used to endorse or promote products derived 14750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// from this software without specific prior written permission. 15750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// 16750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com// 282bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com// Tests for heap profiler 292bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com 3088d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org#include <ctype.h> 3188d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org 32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 33fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-profiler.h" 35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation-tracker.h" 36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hashmap.h" 38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap-profiler.h" 39196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/snapshot.h" 40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils-inl.h" 41196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 422bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com 43b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgusing i::AllocationTraceNode; 44b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgusing i::AllocationTraceTree; 45b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgusing i::AllocationTracker; 46b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgusing i::HashMap; 47b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgusing i::Vector; 48b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 492c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgnamespace { 502c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 512c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgclass NamedEntriesDetector { 522c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org public: 532c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org NamedEntriesDetector() 5401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org : has_A2(false), has_B2(false), has_C2(false) { 552c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 562c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 57967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org void CheckEntry(i::HeapEntry* entry) { 58967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org if (strcmp(entry->name(), "A2") == 0) has_A2 = true; 59967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org if (strcmp(entry->name(), "B2") == 0) has_B2 = true; 60967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org if (strcmp(entry->name(), "C2") == 0) has_C2 = true; 6126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 6226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 6315613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org static bool AddressesMatch(void* key1, void* key2) { 6415613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org return key1 == key2; 6515613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org } 6615613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org 67967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org void CheckAllReachables(i::HeapEntry* root) { 6815613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org i::HashMap visited(AddressesMatch); 69967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org i::List<i::HeapEntry*> list(10); 70967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org list.Add(root); 71967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org CheckEntry(root); 72967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org while (!list.is_empty()) { 73967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org i::HeapEntry* entry = list.RemoveLast(); 74212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org i::Vector<i::HeapGraphEdge*> children = entry->children(); 75967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org for (int i = 0; i < children.length(); ++i) { 76212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org if (children[i]->type() == i::HeapGraphEdge::kShortcut) continue; 77212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org i::HeapEntry* child = children[i]->to(); 7815613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org i::HashMap::Entry* entry = visited.Lookup( 7915613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org reinterpret_cast<void*>(child), 8015613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org static_cast<uint32_t>(reinterpret_cast<uintptr_t>(child)), 8115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org true); 8215613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org if (entry->value) 8315613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org continue; 8415613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org entry->value = reinterpret_cast<void*>(1); 8515613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org list.Add(child); 8615613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org CheckEntry(child); 87967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org } 88967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org } 892c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 902c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 912c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org bool has_A2; 922c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org bool has_B2; 932c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org bool has_C2; 942c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}; 952c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} // namespace 972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 985ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 995ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgstatic const v8::HeapGraphNode* GetGlobalObject( 1005ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapSnapshot* snapshot) { 10121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org CHECK_EQ(2, snapshot->GetRoot()->GetChildrenCount()); 1021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // The 0th-child is (GC Roots), 1st is the user root. 10321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org const v8::HeapGraphNode* global_obj = 1041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org snapshot->GetRoot()->GetChild(1)->GetToNode(); 105d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org CHECK_EQ(0, strncmp("Object", const_cast<i::HeapEntry*>( 106d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org reinterpret_cast<const i::HeapEntry*>(global_obj))->name(), 6)); 10721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org return global_obj; 1085ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 1095ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 1105ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 1115ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgstatic const v8::HeapGraphNode* GetProperty(const v8::HeapGraphNode* node, 1125ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org v8::HeapGraphEdge::Type type, 1135ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const char* name) { 1145ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { 1155ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphEdge* prop = node->GetChild(i); 116906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value prop_name(prop->GetName()); 1175ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (prop->GetType() == type && strcmp(name, *prop_name) == 0) 1185ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org return prop->GetToNode(); 1195ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 1205ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org return NULL; 1215ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 1225ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 1235ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 1245ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgstatic bool HasString(const v8::HeapGraphNode* node, const char* contents) { 1255ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { 1265ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphEdge* prop = node->GetChild(i); 1275ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* node = prop->GetToNode(); 12826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org if (node->GetType() == v8::HeapGraphNode::kString) { 129906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value node_name(node->GetName()); 1305ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (strcmp(contents, *node_name) == 0) return true; 1315ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 1325ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 1335ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org return false; 1345ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 1355ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 1365ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 137bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgstatic bool AddressesMatch(void* key1, void* key2) { 138bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org return key1 == key2; 139bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org} 140bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 141bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 142bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org// Check that snapshot has no unretained entries except root. 143ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic bool ValidateSnapshot(const v8::HeapSnapshot* snapshot, int depth = 3) { 144bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org i::HeapSnapshot* heap_snapshot = const_cast<i::HeapSnapshot*>( 145bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org reinterpret_cast<const i::HeapSnapshot*>(snapshot)); 146bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 147bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org i::HashMap visited(AddressesMatch); 148bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org i::List<i::HeapGraphEdge>& edges = heap_snapshot->edges(); 149bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org for (int i = 0; i < edges.length(); ++i) { 150bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org i::HashMap::Entry* entry = visited.Lookup( 151bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org reinterpret_cast<void*>(edges[i].to()), 152bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static_cast<uint32_t>(reinterpret_cast<uintptr_t>(edges[i].to())), 153bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org true); 154bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org uint32_t ref_count = static_cast<uint32_t>( 155bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org reinterpret_cast<uintptr_t>(entry->value)); 156bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org entry->value = reinterpret_cast<void*>(ref_count + 1); 157bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 158bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org uint32_t unretained_entries_count = 0; 159bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org i::List<i::HeapEntry>& entries = heap_snapshot->entries(); 160bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org for (int i = 0; i < entries.length(); ++i) { 161bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org i::HashMap::Entry* entry = visited.Lookup( 162bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org reinterpret_cast<void*>(&entries[i]), 163bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org static_cast<uint32_t>(reinterpret_cast<uintptr_t>(&entries[i])), 164bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org false); 165bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org if (!entry && entries[i].id() != 1) { 166bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org entries[i].Print("entry with no retainer", "", depth, 0); 167bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org ++unretained_entries_count; 168bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 169bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 17010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org return unretained_entries_count == 0; 171bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org} 172bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 173bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 1742c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgTEST(HeapSnapshot) { 1754980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org LocalContext env2; 1762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env2->GetIsolate()); 177f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env2->GetIsolate()->GetHeapProfiler(); 1782c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 17942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 1802c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org "function A2() {}\n" 1812c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org "function B2(x) { return function() { return typeof x; }; }\n" 1822c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org "function C2(x) { this.x1 = x; this.x2 = x; this[1] = x; }\n" 1832c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org "var a2 = new A2();\n" 1842c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org "var b2_1 = new B2(a2), b2_2 = new B2(a2);\n" 1852c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org "var c2 = new C2(a2);"); 1862c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org const v8::HeapSnapshot* snapshot_env2 = 187f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("env2")); 188ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot_env2)); 1895ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* global_env2 = GetGlobalObject(snapshot_env2); 1902c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 19101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Verify, that JS global object of env2 has '..2' properties. 1925ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* a2_node = 193ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "a2"); 1945ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_NE(NULL, a2_node); 19526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE( 196ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "b2_1")); 19726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE( 198ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "b2_2")); 199ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_NE(NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "c2")); 2002c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2012c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org NamedEntriesDetector det; 202967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org det.CheckAllReachables(const_cast<i::HeapEntry*>( 203967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org reinterpret_cast<const i::HeapEntry*>(global_env2))); 2042c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org CHECK(det.has_A2); 2052c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org CHECK(det.has_B2); 2062c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org CHECK(det.has_C2); 2072c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} 2082c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2095ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 21026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgTEST(HeapSnapshotObjectSizes) { 21126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org LocalContext env; 2122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 213f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 21426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 21526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org // -a-> X1 --a 21626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org // x -b-> X2 <-| 21742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 21826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org "function X(a, b) { this.a = a; this.b = b; }\n" 21926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org "x = new X(new X(), new X());\n" 220ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "dummy = new X();\n" 22121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "(function() { x.a.a = x.b; })();"); 22226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapSnapshot* snapshot = 223f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("sizes")); 224ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 22526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 22626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphNode* x = 227ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "x"); 22826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, x); 22926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphNode* x1 = 23026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(x, v8::HeapGraphEdge::kProperty, "a"); 23126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, x1); 23226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphNode* x2 = 23326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(x, v8::HeapGraphEdge::kProperty, "b"); 23426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, x2); 23521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 236967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org // Test sizes. 237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(0, static_cast<int>(x->GetShallowSize())); 238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(0, static_cast<int>(x1->GetShallowSize())); 239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(0, static_cast<int>(x2->GetShallowSize())); 24026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 24126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 24226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 24365a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.orgTEST(BoundFunctionInSnapshot) { 24465a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org LocalContext env; 2452bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 246f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 24765a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CompileRun( 24865a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org "function myFunction(a, b) { this.a = a; this.b = b; }\n" 24965a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org "function AAAAA() {}\n" 25065a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org "boundFunction = myFunction.bind(new AAAAA(), 20, new Number(12)); \n"); 25165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapSnapshot* snapshot = 252f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("sizes")); 253ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 25465a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 25565a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapGraphNode* f = 256ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "boundFunction"); 25765a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK(f); 258f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org CHECK_EQ(v8::String::NewFromUtf8(env->GetIsolate(), "native_bind"), 259f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f->GetName()); 26065a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapGraphNode* bindings = 26165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org GetProperty(f, v8::HeapGraphEdge::kInternal, "bindings"); 26265a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK_NE(NULL, bindings); 26365a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, bindings->GetType()); 26465a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK_EQ(4, bindings->GetChildrenCount()); 26565a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 26665a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapGraphNode* bound_this = GetProperty( 26765a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org f, v8::HeapGraphEdge::kShortcut, "bound_this"); 26865a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK(bound_this); 26965a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, bound_this->GetType()); 27065a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 27165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapGraphNode* bound_function = GetProperty( 27265a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org f, v8::HeapGraphEdge::kShortcut, "bound_function"); 27365a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK(bound_function); 27465a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK_EQ(v8::HeapGraphNode::kClosure, bound_function->GetType()); 27565a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 27665a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org const v8::HeapGraphNode* bound_argument = GetProperty( 27765a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org f, v8::HeapGraphEdge::kShortcut, "bound_argument_1"); 27865a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK(bound_argument); 27965a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, bound_argument->GetType()); 28065a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org} 28165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 28265a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 28326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgTEST(HeapSnapshotEntryChildren) { 28426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org LocalContext env; 2852bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 286f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 28726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 28842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 28926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org "function A() { }\n" 29026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org "a = new A;"); 29126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapSnapshot* snapshot = 292f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("children")); 293ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 29426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 29526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org for (int i = 0, count = global->GetChildrenCount(); i < count; ++i) { 29626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphEdge* prop = global->GetChild(i); 29726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_EQ(global, prop->GetFromNode()); 29826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 29926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphNode* a = 30026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "a"); 30126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, a); 30226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org for (int i = 0, count = a->GetChildrenCount(); i < count; ++i) { 30326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org const v8::HeapGraphEdge* prop = a->GetChild(i); 30426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_EQ(a, prop->GetFromNode()); 30526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 30626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 30726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 30826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 3095ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgTEST(HeapSnapshotCodeObjects) { 3104980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org LocalContext env; 3112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 312f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 3135ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 31442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 3155ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org "function lazy(x) { return x - 1; }\n" 3165ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org "function compiled(x) { return x + 1; }\n" 317145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com "var anonymous = (function() { return function() { return 0; } })();\n" 3185ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org "compiled(1)"); 3195ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapSnapshot* snapshot = 320f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("code")); 321ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 3225ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 3235ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 3245ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* compiled = 325ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "compiled"); 3265ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_NE(NULL, compiled); 32726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_EQ(v8::HeapGraphNode::kClosure, compiled->GetType()); 3285ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* lazy = 329ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "lazy"); 3305ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_NE(NULL, lazy); 33126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_EQ(v8::HeapGraphNode::kClosure, lazy->GetType()); 332145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com const v8::HeapGraphNode* anonymous = 333ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "anonymous"); 334145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com CHECK_NE(NULL, anonymous); 335145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com CHECK_EQ(v8::HeapGraphNode::kClosure, anonymous->GetType()); 336906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value anonymous_name(anonymous->GetName()); 33742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ("", *anonymous_name); 3385ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 3395ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // Find references to code. 3405ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* compiled_code = 341c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org GetProperty(compiled, v8::HeapGraphEdge::kInternal, "shared"); 3425ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_NE(NULL, compiled_code); 3435ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* lazy_code = 344c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org GetProperty(lazy, v8::HeapGraphEdge::kInternal, "shared"); 3455ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_NE(NULL, lazy_code); 3465ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 34709cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org // Check that there's no strong next_code_link. There might be a weak one 34809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org // but might be not, so we can't check that fact. 34909cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org const v8::HeapGraphNode* code = 35009cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org GetProperty(compiled_code, v8::HeapGraphEdge::kInternal, "code"); 35109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org CHECK_NE(NULL, code); 35209cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org const v8::HeapGraphNode* next_code_link = 35309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org GetProperty(code, v8::HeapGraphEdge::kInternal, "code"); 35409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org CHECK_EQ(NULL, next_code_link); 35509cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org 3565ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // Verify that non-compiled code doesn't contain references to "x" 3576a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org // literal, while compiled code does. The scope info is stored in FixedArray 3586a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org // objects attached to the SharedFunctionInfo. 3595ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org bool compiled_references_x = false, lazy_references_x = false; 3605ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org for (int i = 0, count = compiled_code->GetChildrenCount(); i < count; ++i) { 3615ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphEdge* prop = compiled_code->GetChild(i); 3625ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* node = prop->GetToNode(); 36326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org if (node->GetType() == v8::HeapGraphNode::kArray) { 3645ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (HasString(node, "x")) { 3655ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org compiled_references_x = true; 3665ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org break; 3675ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 3685ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 3695ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 3705ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org for (int i = 0, count = lazy_code->GetChildrenCount(); i < count; ++i) { 3715ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphEdge* prop = lazy_code->GetChild(i); 3725ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org const v8::HeapGraphNode* node = prop->GetToNode(); 37326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org if (node->GetType() == v8::HeapGraphNode::kArray) { 3745ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (HasString(node, "x")) { 3755ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org lazy_references_x = true; 3765ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org break; 3775ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 3785ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 3795ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 3805ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK(compiled_references_x); 3815ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK(!lazy_references_x); 3825ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 3835ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 3844980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 38542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.orgTEST(HeapSnapshotHeapNumbers) { 38642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org LocalContext env; 3872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 388f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 38942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 39042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org "a = 1; // a is Smi\n" 39142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org "b = 2.5; // b is HeapNumber"); 39242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org const v8::HeapSnapshot* snapshot = 393f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("numbers")); 394ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 39542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 396ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); 39742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org const v8::HeapGraphNode* b = 398ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); 39942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_NE(NULL, b); 40042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); 40142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org} 40242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 403e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 404394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTEST(HeapSnapshotSlicedString) { 405394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LocalContext env; 4062bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 407f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 408394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com CompileRun( 409394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com "parent_string = \"123456789.123456789.123456789.123456789.123456789." 410394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com "123456789.123456789.123456789.123456789.123456789." 411394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com "123456789.123456789.123456789.123456789.123456789." 412394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com "123456789.123456789.123456789.123456789.123456789.\";" 413394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com "child_string = parent_string.slice(100);"); 414394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com const v8::HeapSnapshot* snapshot = 415f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("strings")); 416ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 417394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 418394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com const v8::HeapGraphNode* parent_string = 419ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string"); 420394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com CHECK_NE(NULL, parent_string); 421394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com const v8::HeapGraphNode* child_string = 422ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string"); 423394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com CHECK_NE(NULL, child_string); 424c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK_EQ(v8::HeapGraphNode::kSlicedString, child_string->GetType()); 425394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com const v8::HeapGraphNode* parent = 426394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent"); 427394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com CHECK_EQ(parent_string, parent); 428c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org heap_profiler->DeleteAllHeapSnapshots(); 429394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 43042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 431e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 432c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgTEST(HeapSnapshotConsString) { 433528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 434c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org v8::HandleScope scope(isolate); 4359cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org v8::Local<v8::ObjectTemplate> global_template = 4369cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org v8::ObjectTemplate::New(isolate); 437c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org global_template->SetInternalFieldCount(1); 438c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org LocalContext env(NULL, global_template); 439c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org v8::Handle<v8::Object> global_proxy = env->Global(); 440c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 441c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK_EQ(1, global->InternalFieldCount()); 442c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 443528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Factory* factory = CcTest::i_isolate()->factory(); 4442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org i::Handle<i::String> first = factory->NewStringFromStaticChars("0123456789"); 4452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org i::Handle<i::String> second = factory->NewStringFromStaticChars("0123456789"); 446255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org i::Handle<i::String> cons_string = 447255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org factory->NewConsString(first, second).ToHandleChecked(); 448c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 449c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org global->SetInternalField(0, v8::ToApiHandle<v8::String>(cons_string)); 450c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 451c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 452c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org const v8::HeapSnapshot* snapshot = 453c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("cons_strings")); 454c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK(ValidateSnapshot(snapshot)); 455c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); 456c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 457c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org const v8::HeapGraphNode* string_node = 458c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0"); 459c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK_NE(NULL, string_node); 460c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK_EQ(v8::HeapGraphNode::kConsString, string_node->GetType()); 461c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 462c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org const v8::HeapGraphNode* first_node = 463c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org GetProperty(string_node, v8::HeapGraphEdge::kInternal, "first"); 464c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK_EQ(v8::HeapGraphNode::kString, first_node->GetType()); 465c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 466c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org const v8::HeapGraphNode* second_node = 467c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org GetProperty(string_node, v8::HeapGraphEdge::kInternal, "second"); 468c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK_EQ(v8::HeapGraphNode::kString, second_node->GetType()); 469c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 470c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org heap_profiler->DeleteAllHeapSnapshots(); 471c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org} 472c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 473c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 474fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgTEST(HeapSnapshotSymbol) { 475fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org LocalContext env; 476fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 477fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 478fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org 479fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CompileRun("a = Symbol('mySymbol');\n"); 480fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org const v8::HeapSnapshot* snapshot = 481fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("Symbol")); 482fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 483fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 484fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org const v8::HeapGraphNode* a = 485fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "a"); 486fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CHECK_NE(NULL, a); 487fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CHECK_EQ(a->GetType(), v8::HeapGraphNode::kSymbol); 488fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CHECK_EQ(v8_str("symbol"), a->GetName()); 489fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org const v8::HeapGraphNode* name = 490fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org GetProperty(a, v8::HeapGraphEdge::kInternal, "name"); 491fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CHECK_NE(NULL, name); 492fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CHECK_EQ(v8_str("mySymbol"), name->GetName()); 493fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org} 494fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org 495c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 496011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgTEST(HeapSnapshotWeakCollection) { 497011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LocalContext env; 498011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 499011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 500011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 50170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CompileRun( 50270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org "k = {}; v = {}; s = 'str';\n" 50370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org "ws = new WeakSet(); ws.add(k); ws.add(v); ws[s] = s;\n" 50470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org "wm = new WeakMap(); wm.set(k, v); wm[s] = s;\n"); 505011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapSnapshot* snapshot = 506011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("WeakCollections")); 507011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 508011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 509011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* k = 510011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "k"); 511011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_NE(NULL, k); 512011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* v = 513011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "v"); 514011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_NE(NULL, v); 51570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* s = 51670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "s"); 51770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, s); 518011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 519011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* ws = 520011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "ws"); 521011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_NE(NULL, ws); 522011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, ws->GetType()); 523011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(v8_str("WeakSet"), ws->GetName()); 524011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 525011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* ws_table = 526011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org GetProperty(ws, v8::HeapGraphEdge::kInternal, "table"); 527011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, ws_table->GetType()); 528011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_GT(ws_table->GetChildrenCount(), 0); 529011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int weak_entries = 0; 530011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0, count = ws_table->GetChildrenCount(); i < count; ++i) { 531011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphEdge* prop = ws_table->GetChild(i); 532011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (prop->GetType() != v8::HeapGraphEdge::kWeak) continue; 533011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (k->GetId() == prop->GetToNode()->GetId()) { 534011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org ++weak_entries; 535011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 536011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 537011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(1, weak_entries); 53870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* ws_s = 53970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(ws, v8::HeapGraphEdge::kProperty, "str"); 54070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, ws_s); 54170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(ws_s->GetId())); 542011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 543011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* wm = 544011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "wm"); 545011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_NE(NULL, wm); 546011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, wm->GetType()); 547011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(v8_str("WeakMap"), wm->GetName()); 548011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 549011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphNode* wm_table = 550011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org GetProperty(wm, v8::HeapGraphEdge::kInternal, "table"); 551011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, wm_table->GetType()); 552011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_GT(wm_table->GetChildrenCount(), 0); 553011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org weak_entries = 0; 554011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0, count = wm_table->GetChildrenCount(); i < count; ++i) { 555011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::HeapGraphEdge* prop = wm_table->GetChild(i); 556011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (prop->GetType() != v8::HeapGraphEdge::kWeak) continue; 557011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org const v8::SnapshotObjectId to_node_id = prop->GetToNode()->GetId(); 558011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (to_node_id == k->GetId() || to_node_id == v->GetId()) { 559011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org ++weak_entries; 560011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 561011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 562011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org CHECK_EQ(2, weak_entries); 56370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* wm_s = 56470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(wm, v8::HeapGraphEdge::kProperty, "str"); 56570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, wm_s); 56670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(wm_s->GetId())); 56770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org} 56870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 56970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 57070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.orgTEST(HeapSnapshotCollection) { 57170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org LocalContext env; 57270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 57370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 57470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 57570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CompileRun( 57670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org "k = {}; v = {}; s = 'str';\n" 57770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org "set = new Set(); set.add(k); set.add(v); set[s] = s;\n" 57870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org "map = new Map(); map.set(k, v); map[s] = s;\n"); 57970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapSnapshot* snapshot = 58070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("Collections")); 58170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 58270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 58370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* k = 58470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "k"); 58570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, k); 58670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* v = 58770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "v"); 58870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, v); 58970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* s = 59070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "s"); 59170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, s); 59270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 59370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* set = 59470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "set"); 59570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, set); 59670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, set->GetType()); 59770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(v8_str("Set"), set->GetName()); 59870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 59970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* set_table = 60070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(set, v8::HeapGraphEdge::kInternal, "table"); 60170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, set_table->GetType()); 60270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_GT(set_table->GetChildrenCount(), 0); 60370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org int entries = 0; 60470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org for (int i = 0, count = set_table->GetChildrenCount(); i < count; ++i) { 60570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphEdge* prop = set_table->GetChild(i); 60670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::SnapshotObjectId to_node_id = prop->GetToNode()->GetId(); 60770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org if (to_node_id == k->GetId() || to_node_id == v->GetId()) { 60870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org ++entries; 60970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org } 61070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org } 61170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(2, entries); 61270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* set_s = 61370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(set, v8::HeapGraphEdge::kProperty, "str"); 61470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, set_s); 61570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(set_s->GetId())); 61670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 61770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* map = 61870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "map"); 61970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, map); 62070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, map->GetType()); 62170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(v8_str("Map"), map->GetName()); 62270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 62370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* map_table = 62470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(map, v8::HeapGraphEdge::kInternal, "table"); 62570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, map_table->GetType()); 62670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_GT(map_table->GetChildrenCount(), 0); 62770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org entries = 0; 62870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org for (int i = 0, count = map_table->GetChildrenCount(); i < count; ++i) { 62970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphEdge* prop = map_table->GetChild(i); 63070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::SnapshotObjectId to_node_id = prop->GetToNode()->GetId(); 63170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org if (to_node_id == k->GetId() || to_node_id == v->GetId()) { 63270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org ++entries; 63370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org } 63470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org } 63570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(2, entries); 63670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org const v8::HeapGraphNode* map_s = 63770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org GetProperty(map, v8::HeapGraphEdge::kProperty, "str"); 63870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_NE(NULL, map_s); 63970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(map_s->GetId())); 640011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org} 641011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 642011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 64342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.orgTEST(HeapSnapshotInternalReferences) { 644528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 645f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HandleScope scope(isolate); 6469cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org v8::Local<v8::ObjectTemplate> global_template = 6479cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org v8::ObjectTemplate::New(isolate); 64842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org global_template->SetInternalFieldCount(2); 64942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org LocalContext env(NULL, global_template); 65042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org v8::Handle<v8::Object> global_proxy = env->Global(); 65142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 65242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(2, global->InternalFieldCount()); 6530f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::Local<v8::Object> obj = v8::Object::New(isolate); 65442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org global->SetInternalField(0, v8_num(17)); 65542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org global->SetInternalField(1, obj); 656f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 65742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org const v8::HeapSnapshot* snapshot = 658f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("internals")); 659ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 66042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); 66142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // The first reference will not present, because it's a Smi. 66242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0")); 66342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // The second reference is to an object. 66442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_NE(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "1")); 66542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org} 66642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 66742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 6681456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org// Trying to introduce a check helper for uint32_t causes many 6694980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org// overloading ambiguities, so it seems easier just to cast 6704980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org// them to a signed type. 6711456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org#define CHECK_EQ_SNAPSHOT_OBJECT_ID(a, b) \ 6721456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ(static_cast<int32_t>(a), static_cast<int32_t>(b)) 6731456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org#define CHECK_NE_SNAPSHOT_OBJECT_ID(a, b) \ 67426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK((a) != (b)) // NOLINT 6754980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 6762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgTEST(HeapSnapshotAddressReuse) { 6772e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org LocalContext env; 6782bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 679f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 6802e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 6812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org CompileRun( 6822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org "function A() {}\n" 6832e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org "var a = [];\n" 6842e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org "for (var i = 0; i < 10000; ++i)\n" 6852e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org " a[i] = new A();\n"); 6862e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org const v8::HeapSnapshot* snapshot1 = 687f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot1")); 688ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot1)); 6892e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org v8::SnapshotObjectId maxId1 = snapshot1->GetMaxSnapshotJSObjectId(); 6902e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 6912e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org CompileRun( 6922e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org "for (var i = 0; i < 10000; ++i)\n" 6932e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org " a[i] = new A();\n"); 694528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 6952e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 6962e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org const v8::HeapSnapshot* snapshot2 = 697f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot2")); 698ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot2)); 6992e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); 7002e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 7012e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org const v8::HeapGraphNode* array_node = 7022e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); 7032e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org CHECK_NE(NULL, array_node); 7042e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org int wrong_count = 0; 7052e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org for (int i = 0, count = array_node->GetChildrenCount(); i < count; ++i) { 7062e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org const v8::HeapGraphEdge* prop = array_node->GetChild(i); 7072e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org if (prop->GetType() != v8::HeapGraphEdge::kElement) 7082e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org continue; 7092e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org v8::SnapshotObjectId id = prop->GetToNode()->GetId(); 7102e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org if (id < maxId1) 7112e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org ++wrong_count; 7122e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org } 71371fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org CHECK_EQ(0, wrong_count); 7142e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org} 7152e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 7162e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org 7176ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.orgTEST(HeapEntryIdsAndArrayShift) { 7186ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org LocalContext env; 7192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 720f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 7216ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 7226ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CompileRun( 7236ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "function AnObject() {\n" 7246ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org " this.first = 'first';\n" 7256ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org " this.second = 'second';\n" 7266ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "}\n" 7276ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "var a = new Array();\n" 7286ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "for (var i = 0; i < 10; ++i)\n" 7296ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org " a.push(new AnObject());\n"); 7306ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapSnapshot* snapshot1 = 731f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("s1")); 732ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot1)); 7336ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 7346ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CompileRun( 7356ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "for (var i = 0; i < 1; ++i)\n" 7366ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org " a.shift();\n"); 7376ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 738528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 7396ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 7406ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapSnapshot* snapshot2 = 741f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("s2")); 742ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot2)); 7436ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 7446ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); 7456ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); 7461456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId()); 7471456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId()); 7486ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 7496ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapGraphNode* a1 = 7506ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); 7516ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CHECK_NE(NULL, a1); 7526ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapGraphNode* k1 = 753ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(a1, v8::HeapGraphEdge::kInternal, "elements"); 7546ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CHECK_NE(NULL, k1); 7556ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapGraphNode* a2 = 7566ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); 7576ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CHECK_NE(NULL, a2); 7586ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org const v8::HeapGraphNode* k2 = 759ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(a2, v8::HeapGraphEdge::kInternal, "elements"); 7606ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CHECK_NE(NULL, k2); 7616ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 7621456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); 7631456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(k1->GetId(), k2->GetId()); 7646ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org} 7656ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 766e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 7674980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.orgTEST(HeapEntryIdsAndGC) { 7684980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org LocalContext env; 7692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 770f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 7714980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 77242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 7734980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org "function A() {}\n" 7744980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org "function B(x) { this.x = x; }\n" 7754980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org "var a = new A();\n" 7764980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org "var b = new B(a);"); 7771456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org v8::Local<v8::String> s1_str = v8_str("s1"); 7781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org v8::Local<v8::String> s2_str = v8_str("s2"); 7794980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapSnapshot* snapshot1 = 780f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(s1_str); 781ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot1)); 7824980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 783528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 7844980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 7854980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapSnapshot* snapshot2 = 786f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(s2_str); 787ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot2)); 7881456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 7891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_GT(snapshot1->GetMaxSnapshotJSObjectId(), 7000); 7901456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK(snapshot1->GetMaxSnapshotJSObjectId() <= 7911456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org snapshot2->GetMaxSnapshotJSObjectId()); 7924980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 7934980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); 7944980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); 7951456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId()); 7961456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId()); 7974980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* A1 = 79826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global1, v8::HeapGraphEdge::kProperty, "A"); 79926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, A1); 8004980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* A2 = 80126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global2, v8::HeapGraphEdge::kProperty, "A"); 80226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, A2); 8031456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_NE_SNAPSHOT_OBJECT_ID(0, A1->GetId()); 8041456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(A1->GetId(), A2->GetId()); 8054980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* B1 = 80626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global1, v8::HeapGraphEdge::kProperty, "B"); 80726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, B1); 8084980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* B2 = 80926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global2, v8::HeapGraphEdge::kProperty, "B"); 81026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, B2); 8111456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_NE_SNAPSHOT_OBJECT_ID(0, B1->GetId()); 8121456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(B1->GetId(), B2->GetId()); 8134980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* a1 = 81426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); 81526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, a1); 8164980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* a2 = 81726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); 81826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, a2); 8191456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_NE_SNAPSHOT_OBJECT_ID(0, a1->GetId()); 8201456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); 8214980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* b1 = 82226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global1, v8::HeapGraphEdge::kProperty, "b"); 82326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, b1); 8244980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org const v8::HeapGraphNode* b2 = 82526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org GetProperty(global2, v8::HeapGraphEdge::kProperty, "b"); 82626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org CHECK_NE(NULL, b2); 8271456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_NE_SNAPSHOT_OBJECT_ID(0, b1->GetId()); 8281456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(b1->GetId(), b2->GetId()); 8294980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org} 8304980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 8314980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 832eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgTEST(HeapSnapshotRootPreservedAfterSorting) { 833eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org LocalContext env; 8342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 835f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 836eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org const v8::HeapSnapshot* snapshot = 837f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("s")); 838ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 839eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org const v8::HeapGraphNode* root1 = snapshot->GetRoot(); 840eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org const_cast<i::HeapSnapshot*>(reinterpret_cast<const i::HeapSnapshot*>( 841eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org snapshot))->GetSortedEntriesList(); 842eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org const v8::HeapGraphNode* root2 = snapshot->GetRoot(); 843eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org CHECK_EQ(root1, root2); 844eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org} 845eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org 846eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org 847d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.comnamespace { 848d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 849d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.comclass TestJSONStream : public v8::OutputStream { 850d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com public: 851d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com TestJSONStream() : eos_signaled_(0), abort_countdown_(-1) {} 852d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com explicit TestJSONStream(int abort_countdown) 853d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com : eos_signaled_(0), abort_countdown_(abort_countdown) {} 854d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com virtual ~TestJSONStream() {} 855d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com virtual void EndOfStream() { ++eos_signaled_; } 856d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com virtual WriteResult WriteAsciiChunk(char* buffer, int chars_written) { 857d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com if (abort_countdown_ > 0) --abort_countdown_; 858d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com if (abort_countdown_ == 0) return kAbort; 859d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_GT(chars_written, 0); 860d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com i::Vector<char> chunk = buffer_.AddBlock(chars_written, '\0'); 861d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org i::MemCopy(chunk.start(), buffer, chars_written); 862d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com return kContinue; 863d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com } 86428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org virtual WriteResult WriteUint32Chunk(uint32_t* buffer, int chars_written) { 865e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(false); 86628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return kAbort; 86728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 868d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com void WriteTo(i::Vector<char> dest) { buffer_.WriteTo(dest); } 869d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com int eos_signaled() { return eos_signaled_; } 870d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com int size() { return buffer_.size(); } 87128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 872d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com private: 873d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com i::Collector<char> buffer_; 874d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com int eos_signaled_; 875d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com int abort_countdown_; 876d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com}; 877d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 8782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgclass OneByteResource : public v8::String::ExternalOneByteStringResource { 879d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com public: 8802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org explicit OneByteResource(i::Vector<char> string) : data_(string.start()) { 881d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com length_ = string.length(); 882d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com } 883d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com virtual const char* data() const { return data_; } 884d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com virtual size_t length() const { return length_; } 885d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com private: 886d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com const char* data_; 887d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com size_t length_; 888d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com}; 889d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 890d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com} // namespace 891d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 892d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.comTEST(HeapSnapshotJSONSerialization) { 893d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com LocalContext env; 8942bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 895f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 896d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 897d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com#define STRING_LITERAL_FOR_TEST \ 898d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "\"String \\n\\r\\u0008\\u0081\\u0101\\u0801\\u8001\"" 89942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CompileRun( 900d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "function A(s) { this.s = s; }\n" 901d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "function B(x) { this.x = x; }\n" 902d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "var a = new A(" STRING_LITERAL_FOR_TEST ");\n" 903d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "var b = new B(a);"); 904d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com const v8::HeapSnapshot* snapshot = 905f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("json")); 906ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 907bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 908d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com TestJSONStream stream; 909d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); 910d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_GT(stream.size(), 0); 911d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_EQ(1, stream.eos_signaled()); 912d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com i::ScopedVector<char> json(stream.size()); 913d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com stream.WriteTo(json); 914d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 915d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // Verify that snapshot string is valid JSON. 9162c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org OneByteResource* json_res = new OneByteResource(json); 9179f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Local<v8::String> json_string = 91857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org v8::String::NewExternal(env->GetIsolate(), json_res); 919c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com env->Global()->Set(v8_str("json_snapshot"), json_string); 920d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::Value> snapshot_parse_result = CompileRun( 921d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "var parsed = JSON.parse(json_snapshot); true;"); 922d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK(!snapshot_parse_result.IsEmpty()); 923d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 924d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // Verify that snapshot object has required fields. 925d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::Object> parsed_snapshot = 926c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com env->Global()->Get(v8_str("parsed"))->ToObject(); 927c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CHECK(parsed_snapshot->Has(v8_str("snapshot"))); 928c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CHECK(parsed_snapshot->Has(v8_str("nodes"))); 929ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK(parsed_snapshot->Has(v8_str("edges"))); 930c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CHECK(parsed_snapshot->Has(v8_str("strings"))); 931d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 932d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // Get node and edge "member" offsets. 933d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::Value> meta_analysis_result = CompileRun( 934ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "var meta = parsed.snapshot.meta;\n" 9357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org "var edge_count_offset = meta.node_fields.indexOf('edge_count');\n" 936ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "var node_fields_count = meta.node_fields.length;\n" 937ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "var edge_fields_count = meta.edge_fields.length;\n" 938ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "var edge_type_offset = meta.edge_fields.indexOf('type');\n" 939ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "var edge_name_offset = meta.edge_fields.indexOf('name_or_index');\n" 940ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com "var edge_to_node_offset = meta.edge_fields.indexOf('to_node');\n" 941d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "var property_type =" 942ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " meta.edge_types[edge_type_offset].indexOf('property');\n" 94321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "var shortcut_type =" 944ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " meta.edge_types[edge_type_offset].indexOf('shortcut');\n" 9457028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org "var node_count = parsed.nodes.length / node_fields_count;\n" 9467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org "var first_edge_indexes = parsed.first_edge_indexes = [];\n" 9477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org "for (var i = 0, first_edge_index = 0; i < node_count; ++i) {\n" 9487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org " first_edge_indexes[i] = first_edge_index;\n" 9497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org " first_edge_index += edge_fields_count *\n" 9507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org " parsed.nodes[i * node_fields_count + edge_count_offset];\n" 9511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "}\n" 9521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "first_edge_indexes[node_count] = first_edge_index;\n"); 953d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK(!meta_analysis_result.IsEmpty()); 954d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 955d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // A helper function for processing encoded nodes. 956d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CompileRun( 95721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "function GetChildPosByProperty(pos, prop_name, prop_type) {\n" 958d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com " var nodes = parsed.nodes;\n" 959ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " var edges = parsed.edges;\n" 960d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com " var strings = parsed.strings;\n" 9617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org " var node_ordinal = pos / node_fields_count;\n" 9627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org " for (var i = parsed.first_edge_indexes[node_ordinal],\n" 9637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org " count = parsed.first_edge_indexes[node_ordinal + 1];\n" 964ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " i < count; i += edge_fields_count) {\n" 965ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " if (edges[i + edge_type_offset] === prop_type\n" 966ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " && strings[edges[i + edge_name_offset]] === prop_name)\n" 967ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " return edges[i + edge_to_node_offset];\n" 968d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com " }\n" 969d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com " return null;\n" 970d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "}\n"); 971d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // Get the string index using the path: <root> -> <global>.b.x.s 972d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::Value> string_obj_pos_val = CompileRun( 973d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com "GetChildPosByProperty(\n" 974d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com " GetChildPosByProperty(\n" 975d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com " GetChildPosByProperty(" 9761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org " parsed.edges[edge_fields_count + edge_to_node_offset]," 977ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com " \"b\", property_type),\n" 97821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org " \"x\", property_type)," 97921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org " \"s\", property_type)"); 980d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK(!string_obj_pos_val.IsEmpty()); 981d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com int string_obj_pos = 982d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com static_cast<int>(string_obj_pos_val->ToNumber()->Value()); 983d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::Object> nodes_array = 984c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com parsed_snapshot->Get(v8_str("nodes"))->ToObject(); 985d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com int string_index = static_cast<int>( 986d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com nodes_array->Get(string_obj_pos + 1)->ToNumber()->Value()); 987d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_GT(string_index, 0); 988d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::Object> strings_array = 989c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com parsed_snapshot->Get(v8_str("strings"))->ToObject(); 990d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::String> string = strings_array->Get(string_index)->ToString(); 991d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com v8::Local<v8::String> ref_string = 992d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CompileRun(STRING_LITERAL_FOR_TEST)->ToString(); 993d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com#undef STRING_LITERAL_FOR_TEST 994d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_EQ(*v8::String::Utf8Value(ref_string), 995d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com *v8::String::Utf8Value(string)); 996d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com} 997d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 998d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 999d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.comTEST(HeapSnapshotJSONSerializationAborting) { 1000d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com LocalContext env; 10012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1002f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1003d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com const v8::HeapSnapshot* snapshot = 1004f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("abort")); 1005ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1006d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com TestJSONStream stream(5); 1007d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); 1008d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_GT(stream.size(), 0); 1009d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com CHECK_EQ(0, stream.eos_signaled()); 1010d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com} 1011d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 101228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgnamespace { 101328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 101428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgclass TestStatsStream : public v8::OutputStream { 101528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org public: 101628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org TestStatsStream() 101728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org : eos_signaled_(0), 1018fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org updates_written_(0), 101928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org entries_count_(0), 1020ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com entries_size_(0), 102128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org intervals_count_(0), 102228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org first_interval_index_(-1) { } 102328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org TestStatsStream(const TestStatsStream& stream) 102428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org : v8::OutputStream(stream), 102528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org eos_signaled_(stream.eos_signaled_), 1026fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org updates_written_(stream.updates_written_), 102728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org entries_count_(stream.entries_count_), 1028ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com entries_size_(stream.entries_size_), 102928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org intervals_count_(stream.intervals_count_), 103028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org first_interval_index_(stream.first_interval_index_) { } 103128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org virtual ~TestStatsStream() {} 103228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org virtual void EndOfStream() { ++eos_signaled_; } 103328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org virtual WriteResult WriteAsciiChunk(char* buffer, int chars_written) { 1034e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(false); 103528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return kAbort; 103628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 1037fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org virtual WriteResult WriteHeapStatsChunk(v8::HeapStatsUpdate* buffer, 1038fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org int updates_written) { 103928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org ++intervals_count_; 1040e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(updates_written); 1041fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org updates_written_ += updates_written; 104228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org entries_count_ = 0; 1043fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org if (first_interval_index_ == -1 && updates_written != 0) 1044fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org first_interval_index_ = buffer[0].index; 1045fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org for (int i = 0; i < updates_written; ++i) { 1046fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org entries_count_ += buffer[i].count; 1047fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org entries_size_ += buffer[i].size; 1048ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 104928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 105028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return kContinue; 105128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 105228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int eos_signaled() { return eos_signaled_; } 1053fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org int updates_written() { return updates_written_; } 105428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org uint32_t entries_count() const { return entries_count_; } 1055ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com uint32_t entries_size() const { return entries_size_; } 105628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int intervals_count() const { return intervals_count_; } 105728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int first_interval_index() const { return first_interval_index_; } 105828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 105928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org private: 106028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int eos_signaled_; 1061fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org int updates_written_; 106228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org uint32_t entries_count_; 1063ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com uint32_t entries_size_; 106428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int intervals_count_; 106528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int first_interval_index_; 106628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org}; 106728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 106828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} // namespace 106928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 1070400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.orgstatic TestStatsStream GetHeapStatsUpdate( 1071f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler, 1072400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org v8::SnapshotObjectId* object_id = NULL) { 107328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org TestStatsStream stream; 1074f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::SnapshotObjectId last_seen_id = heap_profiler->GetHeapStats(&stream); 1075400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org if (object_id) 1076400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org *object_id = last_seen_id; 107728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stream.eos_signaled()); 107828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return stream; 107928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 108028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 108128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 108228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgTEST(HeapSnapshotObjectsStats) { 108328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org LocalContext env; 10842bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1085f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 108628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 1087f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->StartTrackingHeapObjects(); 10887a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org // We have to call GC 6 times. In other case the garbage will be 108928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // the reason of flakiness. 10907a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org for (int i = 0; i < 6; ++i) { 1091528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 109228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 109328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 1094400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org v8::SnapshotObjectId initial_id; 109528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 109628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Single chunk of data expected in update. Initial data. 1097f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler, 1098f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org &initial_id); 109928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.intervals_count()); 1100fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1101ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_LT(0, stats_update.entries_size()); 110228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(0, stats_update.first_interval_index()); 110328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 110428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 110528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // No data expected in update because nothing has happened. 1106400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org v8::SnapshotObjectId same_id; 1107f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, GetHeapStatsUpdate(heap_profiler, &same_id).updates_written()); 1108400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(initial_id, same_id); 1109400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org 111028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 1111400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org v8::SnapshotObjectId additional_string_id; 11122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope inner_scope_1(env->GetIsolate()); 1113ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com v8_str("string1"); 111428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 111528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Single chunk of data with one new entry expected in update. 1116f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler, 1117f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org &additional_string_id); 1118400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org CHECK_LT(same_id, additional_string_id); 111928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.intervals_count()); 1120fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1121ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_LT(0, stats_update.entries_size()); 112228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.entries_count()); 112328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(2, stats_update.first_interval_index()); 112428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 112528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 112628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // No data expected in update because nothing happened. 1127400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org v8::SnapshotObjectId last_id; 1128f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, GetHeapStatsUpdate(heap_profiler, &last_id).updates_written()); 1129400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(additional_string_id, last_id); 113028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 113128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 11322bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope inner_scope_2(env->GetIsolate()); 1133ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com v8_str("string2"); 113428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 1135ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com uint32_t entries_size; 113628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 11372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope inner_scope_3(env->GetIsolate()); 1138ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com v8_str("string3"); 1139ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com v8_str("string4"); 114028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 114128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 114228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Single chunk of data with three new entries expected in update. 1143f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler); 114428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.intervals_count()); 1145fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1146ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_LT(0, entries_size = stats_update.entries_size()); 114728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(3, stats_update.entries_count()); 114828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(4, stats_update.first_interval_index()); 114928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 115028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 115128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 115228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 115328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Single chunk of data with two left entries expected in update. 1154f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler); 115528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.intervals_count()); 1156fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1157ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_GT(entries_size, stats_update.entries_size()); 115828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.entries_count()); 115928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Two strings from forth interval were released. 116028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(4, stats_update.first_interval_index()); 116128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 116228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 116328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 116428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 116528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Single chunk of data with 0 left entries expected in update. 1166f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler); 116728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.intervals_count()); 1168fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1169ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(0, stats_update.entries_size()); 117028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(0, stats_update.entries_count()); 117128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // The last string from forth interval was released. 117228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(4, stats_update.first_interval_index()); 117328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 117428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 117528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org { 117628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // Single chunk of data with 0 left entries expected in update. 1177f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler); 117828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(1, stats_update.intervals_count()); 1179fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1180ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(0, stats_update.entries_size()); 118128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(0, stats_update.entries_count()); 118228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org // The only string from the second interval was released. 118328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org CHECK_EQ(2, stats_update.first_interval_index()); 118428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 118528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 11869f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Local<v8::Array> array = v8::Array::New(env->GetIsolate()); 1187ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(0, array->Length()); 1188ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Force array's buffer allocation. 1189ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com array->Set(2, v8_num(7)); 1190ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1191ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com uint32_t entries_size; 1192ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com { 1193ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Single chunk of data with 2 entries expected in update. 1194f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler); 1195ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(1, stats_update.intervals_count()); 1196fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, stats_update.updates_written()); 1197ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_LT(0, entries_size = stats_update.entries_size()); 1198ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // They are the array and its buffer. 1199ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(2, stats_update.entries_count()); 1200ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(8, stats_update.first_interval_index()); 1201ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1202ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1203ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com for (int i = 0; i < 100; ++i) 1204ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com array->Set(i, v8_num(i)); 1205ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1206ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com { 1207ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Single chunk of data with 1 entry expected in update. 1208f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org TestStatsStream stats_update = GetHeapStatsUpdate(heap_profiler); 1209ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(1, stats_update.intervals_count()); 1210ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // The first interval was changed because old buffer was collected. 1211ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // The second interval was changed because new buffer was allocated. 1212fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(2, stats_update.updates_written()); 1213ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_LT(entries_size, stats_update.entries_size()); 1214ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(2, stats_update.entries_count()); 1215ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(8, stats_update.first_interval_index()); 1216ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1217ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1218f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->StopTrackingHeapObjects(); 121928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 122028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 1221beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 12224f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgTEST(HeapObjectIds) { 12234f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org LocalContext env; 12244f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::Isolate* isolate = env->GetIsolate(); 12254f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::HandleScope scope(isolate); 12264f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 12274f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12284f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org const int kLength = 10; 12294f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::Handle<v8::Object> objects[kLength]; 12304f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::SnapshotObjectId ids[kLength]; 12314f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12324f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org heap_profiler->StartTrackingHeapObjects(false); 12334f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12344f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < kLength; i++) { 12354f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org objects[i] = v8::Object::New(isolate); 12364f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 12374f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org GetHeapStatsUpdate(heap_profiler); 12384f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12394f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < kLength; i++) { 12404f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::SnapshotObjectId id = heap_profiler->GetObjectId(objects[i]); 12414f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org CHECK_NE(v8::HeapProfiler::kUnknownObjectId, static_cast<int>(id)); 12424f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ids[i] = id; 12434f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 12444f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12454f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org heap_profiler->StopTrackingHeapObjects(); 12464f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org CcTest::heap()->CollectAllAvailableGarbage(); 12474f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12484f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < kLength; i++) { 12494f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::SnapshotObjectId id = heap_profiler->GetObjectId(objects[i]); 12504f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org CHECK_EQ(static_cast<int>(ids[i]), static_cast<int>(id)); 12514f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::Handle<v8::Value> obj = heap_profiler->FindObjectById(ids[i]); 12524f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org CHECK_EQ(objects[i], obj); 12534f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 12544f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12554f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org heap_profiler->ClearObjectIds(); 12564f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < kLength; i++) { 12574f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::SnapshotObjectId id = heap_profiler->GetObjectId(objects[i]); 12584f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org CHECK_EQ(v8::HeapProfiler::kUnknownObjectId, static_cast<int>(id)); 12594f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org v8::Handle<v8::Value> obj = heap_profiler->FindObjectById(ids[i]); 12604f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org CHECK(obj.IsEmpty()); 12614f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 12624f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org} 12634f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 12644f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 126564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgstatic void CheckChildrenIds(const v8::HeapSnapshot* snapshot, 126664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* node, 126764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org int level, int max_level) { 126864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (level > max_level) return; 126964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK_EQ(node, snapshot->GetNodeById(node->GetId())); 127064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { 127164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphEdge* prop = node->GetChild(i); 127264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* child = 127364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org snapshot->GetNodeById(prop->GetToNode()->GetId()); 12741456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org CHECK_EQ_SNAPSHOT_OBJECT_ID(prop->GetToNode()->GetId(), child->GetId()); 127564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK_EQ(prop->GetToNode(), child); 127664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CheckChildrenIds(snapshot, child, level + 1, max_level); 127764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org } 127864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 127964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 128064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 1281a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgTEST(HeapSnapshotGetNodeById) { 1282a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LocalContext env; 12832bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1284f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1286a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const v8::HeapSnapshot* snapshot = 1287f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("id")); 1288ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const v8::HeapGraphNode* root = snapshot->GetRoot(); 129064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CheckChildrenIds(snapshot, root, 0, 3); 1291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Check a big id, which should not exist yet. 1292a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(NULL, snapshot->GetNodeById(0x1000000UL)); 1293a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1294a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 12955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1296ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comTEST(HeapSnapshotGetSnapshotObjectId) { 1297ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com LocalContext env; 12982bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1299f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1300ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CompileRun("globalObject = {};\n"); 1301ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const v8::HeapSnapshot* snapshot = 1302f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("get_snapshot_object_id")); 1303ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1304ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1305ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const v8::HeapGraphNode* global_object = 1306ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "globalObject"); 1307ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK(global_object); 1308ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1309f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Value> globalObjectHandle = env->Global()->Get( 1310f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "globalObject")); 1311ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK(!globalObjectHandle.IsEmpty()); 1312ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK(globalObjectHandle->IsObject()); 1313ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1314f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::SnapshotObjectId id = heap_profiler->GetObjectId(globalObjectHandle); 1315ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_NE(static_cast<int>(v8::HeapProfiler::kUnknownObjectId), 1316ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com id); 1317ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(static_cast<int>(id), global_object->GetId()); 1318ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 1319ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1320ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1321ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comTEST(HeapSnapshotUnknownSnapshotObjectId) { 1322ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com LocalContext env; 13232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1324f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1325ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CompileRun("globalObject = {};\n"); 1326ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const v8::HeapSnapshot* snapshot = 1327f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("unknown_object_id")); 1328ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1329ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const v8::HeapGraphNode* node = 1330ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com snapshot->GetNodeById(v8::HeapProfiler::kUnknownObjectId); 1331ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com CHECK_EQ(NULL, node); 1332ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 1333ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1334ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 13355f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgnamespace { 13365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 13375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgclass TestActivityControl : public v8::ActivityControl { 13385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org public: 13395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org explicit TestActivityControl(int abort_count) 13405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org : done_(0), total_(0), abort_count_(abort_count) {} 13415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org ControlOption ReportProgressValue(int done, int total) { 13425f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org done_ = done; 13435f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org total_ = total; 13445f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return --abort_count_ != 0 ? kContinue : kAbort; 13455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org } 13465f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org int done() { return done_; } 13475f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org int total() { return total_; } 13485f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 13495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org private: 13505f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org int done_; 13515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org int total_; 13525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org int abort_count_; 13535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}; 13545f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 13555f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1356e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 13575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgTEST(TakeHeapSnapshotAborting) { 13585f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org LocalContext env; 13592bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 13605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1361f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1362f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org const int snapshots_count = heap_profiler->GetSnapshotCount(); 1363a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org TestActivityControl aborting_control(1); 13645f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org const v8::HeapSnapshot* no_snapshot = 1365f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("abort"), 13665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org &aborting_control); 13675f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org CHECK_EQ(NULL, no_snapshot); 1368f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(snapshots_count, heap_profiler->GetSnapshotCount()); 13695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org CHECK_GT(aborting_control.total(), aborting_control.done()); 13705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 13715f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org TestActivityControl control(-1); // Don't abort. 13725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org const v8::HeapSnapshot* snapshot = 1373f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("full"), 13745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org &control); 1375ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1376bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 13775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org CHECK_NE(NULL, snapshot); 1378f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(snapshots_count + 1, heap_profiler->GetSnapshotCount()); 13795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org CHECK_EQ(control.total(), control.done()); 13805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org CHECK_GT(control.total(), 0); 13815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 13825f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1383b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1384b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgnamespace { 1385b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1386b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgclass TestRetainedObjectInfo : public v8::RetainedObjectInfo { 1387b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org public: 1388b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org TestRetainedObjectInfo(int hash, 1389fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org const char* group_label, 1390b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const char* label, 1391b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org intptr_t element_count = -1, 1392b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org intptr_t size = -1) 1393b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org : disposed_(false), 1394b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org hash_(hash), 1395fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org group_label_(group_label), 1396b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org label_(label), 1397b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org element_count_(element_count), 1398b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org size_(size) { 1399b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org instances.Add(this); 1400b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1401b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual ~TestRetainedObjectInfo() {} 1402b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual void Dispose() { 1403b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK(!disposed_); 1404b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org disposed_ = true; 1405b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1406b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual bool IsEquivalent(RetainedObjectInfo* other) { 1407b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return GetHash() == other->GetHash(); 1408b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1409b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual intptr_t GetHash() { return hash_; } 1410fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org virtual const char* GetGroupLabel() { return group_label_; } 1411b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual const char* GetLabel() { return label_; } 1412b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual intptr_t GetElementCount() { return element_count_; } 1413b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org virtual intptr_t GetSizeInBytes() { return size_; } 1414b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org bool disposed() { return disposed_; } 1415b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1416b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org static v8::RetainedObjectInfo* WrapperInfoCallback( 1417b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org uint16_t class_id, v8::Handle<v8::Value> wrapper) { 1418b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org if (class_id == 1) { 1419b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org if (wrapper->IsString()) { 1420906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value utf8(wrapper); 1421906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (strcmp(*utf8, "AAA") == 0) 1422fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return new TestRetainedObjectInfo(1, "aaa-group", "aaa", 100); 1423906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org else if (strcmp(*utf8, "BBB") == 0) 1424fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return new TestRetainedObjectInfo(1, "aaa-group", "aaa", 100); 1425b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1426b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } else if (class_id == 2) { 1427b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org if (wrapper->IsString()) { 1428906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value utf8(wrapper); 1429906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (strcmp(*utf8, "CCC") == 0) 1430fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return new TestRetainedObjectInfo(2, "ccc-group", "ccc"); 1431b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1432b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1433b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK(false); 1434b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return NULL; 1435b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1436b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1437b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org static i::List<TestRetainedObjectInfo*> instances; 1438b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1439b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org private: 1440b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org bool disposed_; 1441b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org int hash_; 1442fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org const char* group_label_; 1443b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const char* label_; 1444b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org intptr_t element_count_; 1445b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org intptr_t size_; 1446b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org}; 1447b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1448b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1449b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgi::List<TestRetainedObjectInfo*> TestRetainedObjectInfo::instances; 1450b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 1451b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1452b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1453b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgstatic const v8::HeapGraphNode* GetNode(const v8::HeapGraphNode* parent, 1454b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org v8::HeapGraphNode::Type type, 1455b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const char* name) { 1456b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org for (int i = 0, count = parent->GetChildrenCount(); i < count; ++i) { 1457b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapGraphNode* node = parent->GetChild(i)->GetToNode(); 1458b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org if (node->GetType() == type && strcmp(name, 1459b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const_cast<i::HeapEntry*>( 1460b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org reinterpret_cast<const i::HeapEntry*>(node))->name()) == 0) { 1461b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return node; 1462b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1463b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1464b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return NULL; 1465b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 1466b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1467b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1468b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgTEST(HeapSnapshotRetainedObjectInfo) { 1469b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org LocalContext env; 1470d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org v8::Isolate* isolate = env->GetIsolate(); 14712bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(isolate); 1472f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 1473b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1474f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->SetWrapperClassInfoProvider( 1475b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1, TestRetainedObjectInfo::WrapperInfoCallback); 1476f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->SetWrapperClassInfoProvider( 1477b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 2, TestRetainedObjectInfo::WrapperInfoCallback); 1478c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Persistent<v8::String> p_AAA(isolate, v8_str("AAA")); 1479e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org p_AAA.SetWrapperClassId(1); 1480c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Persistent<v8::String> p_BBB(isolate, v8_str("BBB")); 1481e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org p_BBB.SetWrapperClassId(1); 1482c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Persistent<v8::String> p_CCC(isolate, v8_str("CCC")); 1483e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org p_CCC.SetWrapperClassId(2); 1484b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_EQ(0, TestRetainedObjectInfo::instances.length()); 1485b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapSnapshot* snapshot = 1486f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("retained")); 1487ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1488b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1489b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_EQ(3, TestRetainedObjectInfo::instances.length()); 1490b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org for (int i = 0; i < TestRetainedObjectInfo::instances.length(); ++i) { 1491b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK(TestRetainedObjectInfo::instances[i]->disposed()); 1492b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org delete TestRetainedObjectInfo::instances[i]; 1493b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org } 1494b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1495fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org const v8::HeapGraphNode* native_group_aaa = GetNode( 1496ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "aaa-group"); 1497fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org CHECK_NE(NULL, native_group_aaa); 1498fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org CHECK_EQ(1, native_group_aaa->GetChildrenCount()); 1499b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapGraphNode* aaa = GetNode( 1500fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org native_group_aaa, v8::HeapGraphNode::kNative, "aaa / 100 entries"); 1501b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_NE(NULL, aaa); 1502fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org CHECK_EQ(2, aaa->GetChildrenCount()); 1503fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 1504fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org const v8::HeapGraphNode* native_group_ccc = GetNode( 1505ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "ccc-group"); 1506b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapGraphNode* ccc = GetNode( 1507fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org native_group_ccc, v8::HeapGraphNode::kNative, "ccc"); 1508b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_NE(NULL, ccc); 1509b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1510b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapGraphNode* n_AAA = GetNode( 1511b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org aaa, v8::HeapGraphNode::kString, "AAA"); 1512b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_NE(NULL, n_AAA); 1513b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapGraphNode* n_BBB = GetNode( 1514b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org aaa, v8::HeapGraphNode::kString, "BBB"); 1515b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_NE(NULL, n_BBB); 1516b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_EQ(1, ccc->GetChildrenCount()); 1517b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org const v8::HeapGraphNode* n_CCC = GetNode( 1518b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org ccc, v8::HeapGraphNode::kString, "CCC"); 1519b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org CHECK_NE(NULL, n_CCC); 1520b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1521c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org CHECK_EQ(aaa, GetProperty(n_AAA, v8::HeapGraphEdge::kInternal, "native")); 1522c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org CHECK_EQ(aaa, GetProperty(n_BBB, v8::HeapGraphEdge::kInternal, "native")); 1523c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "native")); 1524b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 1525b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1526ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1527994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgclass GraphWithImplicitRefs { 1528994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org public: 1529994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org static const int kObjectsCount = 4; 1530994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org explicit GraphWithImplicitRefs(LocalContext* env) { 1531994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CHECK_EQ(NULL, instance_); 1532994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org instance_ = this; 1533ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org isolate_ = (*env)->GetIsolate(); 1534994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for (int i = 0; i < kObjectsCount; i++) { 15350f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org objects_[i].Reset(isolate_, v8::Object::New(isolate_)); 1536994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 153757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org (*env)->Global()->Set(v8_str("root_object"), 153857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Local<v8::Value>::New(isolate_, objects_[0])); 1539994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 1540994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org ~GraphWithImplicitRefs() { 1541994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org instance_ = NULL; 1542994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 1543994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1544003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org static void gcPrologue(v8::GCType type, v8::GCCallbackFlags flags) { 1545994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org instance_->AddImplicitReferences(); 1546994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 1547994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1548994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org private: 1549994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org void AddImplicitReferences() { 1550994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // 0 -> 1 1551c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org isolate_->SetObjectGroupId(objects_[0], 1552ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org v8::UniqueId(1)); 1553ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org isolate_->SetReferenceFromGroup( 1554c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::UniqueId(1), objects_[1]); 1555ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // Adding two more references: 1 -> 2, 1 -> 3 1556c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org isolate_->SetReference(objects_[1].As<v8::Object>(), 1557c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org objects_[2]); 1558c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org isolate_->SetReference(objects_[1].As<v8::Object>(), 1559c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org objects_[3]); 1560994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 1561994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1562994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org v8::Persistent<v8::Value> objects_[kObjectsCount]; 1563994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org static GraphWithImplicitRefs* instance_; 1564ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org v8::Isolate* isolate_; 1565994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org}; 1566994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1567994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgGraphWithImplicitRefs* GraphWithImplicitRefs::instance_ = NULL; 1568994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1569994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1570994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgTEST(HeapSnapshotImplicitReferences) { 1571994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org LocalContext env; 15722bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1573f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1574994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1575994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GraphWithImplicitRefs graph(&env); 1576003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org v8::V8::AddGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); 1577994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1578994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const v8::HeapSnapshot* snapshot = 1579f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("implicit_refs")); 1580ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1581994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1582994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot); 1583994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const v8::HeapGraphNode* obj0 = GetProperty( 1584ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com global_object, v8::HeapGraphEdge::kProperty, "root_object"); 1585994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CHECK(obj0); 1586994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CHECK_EQ(v8::HeapGraphNode::kObject, obj0->GetType()); 1587994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const v8::HeapGraphNode* obj1 = GetProperty( 1588994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org obj0, v8::HeapGraphEdge::kInternal, "native"); 1589994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CHECK(obj1); 1590994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org int implicit_targets_count = 0; 1591994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for (int i = 0, count = obj1->GetChildrenCount(); i < count; ++i) { 1592994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const v8::HeapGraphEdge* prop = obj1->GetChild(i); 1593906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value prop_name(prop->GetName()); 1594994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (prop->GetType() == v8::HeapGraphEdge::kInternal && 1595994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org strcmp("native", *prop_name) == 0) { 1596994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org ++implicit_targets_count; 1597994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 1598994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 1599994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CHECK_EQ(2, implicit_targets_count); 1600003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org v8::V8::RemoveGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); 1601994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 1602994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1603994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 1604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgTEST(DeleteAllHeapSnapshots) { 1605ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LocalContext env; 16062bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1607f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1608f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 1609f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1610f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->DeleteAllHeapSnapshots(); 1611f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1612f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_NE(NULL, heap_profiler->TakeHeapSnapshot(v8_str("1"))); 1613f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(1, heap_profiler->GetSnapshotCount()); 1614f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->DeleteAllHeapSnapshots(); 1615f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1616f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_NE(NULL, heap_profiler->TakeHeapSnapshot(v8_str("1"))); 1617f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_NE(NULL, heap_profiler->TakeHeapSnapshot(v8_str("2"))); 1618f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(2, heap_profiler->GetSnapshotCount()); 1619f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->DeleteAllHeapSnapshots(); 1620f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1621ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1622ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1624c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgstatic const v8::HeapSnapshot* FindHeapSnapshot(v8::HeapProfiler* profiler, 1625c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org unsigned uid) { 1626c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org int length = profiler->GetSnapshotCount(); 1627c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < length; i++) { 1628c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org const v8::HeapSnapshot* snapshot = profiler->GetHeapSnapshot(i); 1629c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (snapshot->GetUid() == uid) { 1630c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org return snapshot; 1631c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 1632c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 1633c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org return NULL; 1634c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 1635c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1636c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgTEST(DeleteHeapSnapshot) { 1638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LocalContext env; 16392bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1640f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1641ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1642f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const v8::HeapSnapshot* s1 = 1644f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("1")); 1645bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 1646ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(NULL, s1); 1647f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(1, heap_profiler->GetSnapshotCount()); 1648ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned uid1 = s1->GetUid(); 1649c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(s1, FindHeapSnapshot(heap_profiler, uid1)); 1650ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const_cast<v8::HeapSnapshot*>(s1)->Delete(); 1651f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1652c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(NULL, FindHeapSnapshot(heap_profiler, uid1)); 1653ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1654ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const v8::HeapSnapshot* s2 = 1655f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("2")); 1656ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(NULL, s2); 1657f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(1, heap_profiler->GetSnapshotCount()); 1658ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned uid2 = s2->GetUid(); 1659ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(static_cast<int>(uid1), static_cast<int>(uid2)); 1660c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(s2, FindHeapSnapshot(heap_profiler, uid2)); 1661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const v8::HeapSnapshot* s3 = 1662f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("3")); 1663ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(NULL, s3); 1664f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(2, heap_profiler->GetSnapshotCount()); 1665ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned uid3 = s3->GetUid(); 1666ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(static_cast<int>(uid1), static_cast<int>(uid3)); 1667c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(s3, FindHeapSnapshot(heap_profiler, uid3)); 1668ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const_cast<v8::HeapSnapshot*>(s2)->Delete(); 1669f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(1, heap_profiler->GetSnapshotCount()); 1670c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(NULL, FindHeapSnapshot(heap_profiler, uid2)); 1671c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(s3, FindHeapSnapshot(heap_profiler, uid3)); 1672ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const_cast<v8::HeapSnapshot*>(s3)->Delete(); 1673f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CHECK_EQ(0, heap_profiler->GetSnapshotCount()); 1674c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CHECK_EQ(NULL, FindHeapSnapshot(heap_profiler, uid3)); 1675ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1676ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1677d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 167832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgclass NameResolver : public v8::HeapProfiler::ObjectNameResolver { 167932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org public: 168032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org virtual const char* GetName(v8::Handle<v8::Object> object) { 168132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org return "Global object name"; 168232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org } 168332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}; 168432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 1685e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 168632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgTEST(GlobalObjectName) { 168732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org LocalContext env; 16882bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1689f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 169032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 169132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org CompileRun("document = { URL:\"abcdefgh\" };"); 169232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 169332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org NameResolver name_resolver; 169432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org const v8::HeapSnapshot* snapshot = 1695f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("document"), 169632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org NULL, 169732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org &name_resolver); 1698ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 169932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 170032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org CHECK_NE(NULL, global); 170132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org CHECK_EQ("Object / Global object name" , 170232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org const_cast<i::HeapEntry*>( 170332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org reinterpret_cast<const i::HeapEntry*>(global))->name()); 170432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org} 170532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 170632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 170757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgTEST(GlobalObjectFields) { 170857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org LocalContext env; 170957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 171057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 171157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org CompileRun("obj = {};"); 171257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org const v8::HeapSnapshot* snapshot = 171357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 171457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 171557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 171657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org const v8::HeapGraphNode* builtins = 171757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kInternal, "builtins"); 171857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org CHECK_NE(NULL, builtins); 171957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org const v8::HeapGraphNode* native_context = 172057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kInternal, "native_context"); 172157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org CHECK_NE(NULL, native_context); 172257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org const v8::HeapGraphNode* global_context = 172357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kInternal, "global_context"); 172457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org CHECK_NE(NULL, global_context); 172558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org const v8::HeapGraphNode* global_proxy = 172658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kInternal, "global_proxy"); 172758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org CHECK_NE(NULL, global_proxy); 172857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org} 172957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 173057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 17310ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryTEST(NoHandleLeaks) { 17320ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LocalContext env; 17332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1734f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 17350ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry CompileRun("document = { URL:\"abcdefgh\" };"); 17370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry v8::Handle<v8::String> name(v8_str("leakz")); 1739528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = CcTest::i_isolate(); 174009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org int count_before = i::HandleScope::NumberOfHandles(isolate); 1741f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(name); 174209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org int count_after = i::HandleScope::NumberOfHandles(isolate); 17430ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry CHECK_EQ(count_before, count_after); 17440ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17450ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17460ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 1747ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgTEST(NodesIteration) { 1748ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org LocalContext env; 17492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1750f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1751ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org const v8::HeapSnapshot* snapshot = 1752f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("iteration")); 1753ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1754ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1755ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org CHECK_NE(NULL, global); 1756ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org // Verify that we can find this object by iteration. 1757ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org const int nodes_count = snapshot->GetNodesCount(); 1758ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org int count = 0; 1759ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org for (int i = 0; i < nodes_count; ++i) { 1760ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org if (snapshot->GetNode(i) == global) 1761ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org ++count; 1762ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org } 1763ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org CHECK_EQ(1, count); 1764ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org} 1765ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 1766ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 17674954674151afa960af66efb4831df06bde727333yangguo@chromium.orgTEST(GetHeapValueForNode) { 1768c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LocalContext env; 17692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1770f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1771c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 177258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org CompileRun("a = { s_prop: \'value\', n_prop: \'value2\' };"); 1773c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapSnapshot* snapshot = 1774f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("value")); 1775ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1776c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 17774954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(heap_profiler->FindObjectById(global->GetId())->IsObject()); 1778c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com v8::Local<v8::Object> js_global = 1779c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com env->Global()->GetPrototype().As<v8::Object>(); 17804954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(js_global == heap_profiler->FindObjectById(global->GetId())); 1781c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* obj = GetProperty( 1782ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com global, v8::HeapGraphEdge::kProperty, "a"); 17834954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(heap_profiler->FindObjectById(obj->GetId())->IsObject()); 1784c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com v8::Local<v8::Object> js_obj = js_global->Get(v8_str("a")).As<v8::Object>(); 17854954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(js_obj == heap_profiler->FindObjectById(obj->GetId())); 1786c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* s_prop = 1787c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com GetProperty(obj, v8::HeapGraphEdge::kProperty, "s_prop"); 1788c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com v8::Local<v8::String> js_s_prop = 1789c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com js_obj->Get(v8_str("s_prop")).As<v8::String>(); 17904954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(js_s_prop == heap_profiler->FindObjectById(s_prop->GetId())); 1791c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* n_prop = 1792c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com GetProperty(obj, v8::HeapGraphEdge::kProperty, "n_prop"); 179358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org v8::Local<v8::String> js_n_prop = 179458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org js_obj->Get(v8_str("n_prop")).As<v8::String>(); 179558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org CHECK(js_n_prop == heap_profiler->FindObjectById(n_prop->GetId())); 1796c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1797c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1798c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1799c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comTEST(GetHeapValueForDeletedObject) { 1800c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LocalContext env; 18012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1802f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1803c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1804c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // It is impossible to delete a global property, so we are about to delete a 1805c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // property of the "a" object. Also, the "p" object can't be an empty one 1806c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // because the empty object is static and isn't actually deleted. 1807c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CompileRun("a = { p: { r: {} } };"); 1808c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapSnapshot* snapshot = 1809f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1810ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1811c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1812c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* obj = GetProperty( 1813ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com global, v8::HeapGraphEdge::kProperty, "a"); 1814c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const v8::HeapGraphNode* prop = GetProperty( 1815c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com obj, v8::HeapGraphEdge::kProperty, "p"); 1816c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { 1817c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Perform the check inside a nested local scope to avoid creating a 1818c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // reference to the object we are deleting. 18192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 18204954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(heap_profiler->FindObjectById(prop->GetId())->IsObject()); 1821c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1822c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CompileRun("delete a.p;"); 18234954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(heap_profiler->FindObjectById(prop->GetId()).IsEmpty()); 1824c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1825c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1826c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1827ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.orgstatic int StringCmp(const char* ref, i::String* act) { 182883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org i::SmartArrayPointer<char> s_act = act->ToCString(); 1829afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org int result = strcmp(ref, s_act.get()); 1830ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org if (result != 0) 1831afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org fprintf(stderr, "Expected: \"%s\", Actual: \"%s\"\n", ref, s_act.get()); 1832ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org return result; 1833ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org} 1834ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 1835ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 1836ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.orgTEST(GetConstructorName) { 1837ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org LocalContext env; 18382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1839ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 1840ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org CompileRun( 1841ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "function Constructor1() {};\n" 1842ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var obj1 = new Constructor1();\n" 1843ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var Constructor2 = function() {};\n" 1844ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var obj2 = new Constructor2();\n" 1845ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var obj3 = {};\n" 1846ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "obj3.constructor = function Constructor3() {};\n" 1847ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var obj4 = {};\n" 1848ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "// Slow properties\n" 1849ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "for (var i=0; i<2000; ++i) obj4[\"p\" + i] = i;\n" 1850ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "obj4.constructor = function Constructor4() {};\n" 1851ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var obj5 = {};\n" 1852ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "var obj6 = {};\n" 1853ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "obj6.constructor = 6;"); 1854ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> js_global = 1855ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org env->Global()->GetPrototype().As<v8::Object>(); 1856ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> obj1 = js_global->Get(v8_str("obj1")).As<v8::Object>(); 1857ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org i::Handle<i::JSObject> js_obj1 = v8::Utils::OpenHandle(*obj1); 1858ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org CHECK_EQ(0, StringCmp( 1859ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "Constructor1", i::V8HeapExplorer::GetConstructorName(*js_obj1))); 1860ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> obj2 = js_global->Get(v8_str("obj2")).As<v8::Object>(); 1861ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org i::Handle<i::JSObject> js_obj2 = v8::Utils::OpenHandle(*obj2); 1862ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org CHECK_EQ(0, StringCmp( 1863ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "Constructor2", i::V8HeapExplorer::GetConstructorName(*js_obj2))); 1864ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> obj3 = js_global->Get(v8_str("obj3")).As<v8::Object>(); 1865ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org i::Handle<i::JSObject> js_obj3 = v8::Utils::OpenHandle(*obj3); 1866e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org // TODO(verwaest): Restore to Constructor3 once supported by the 1867e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org // heap-snapshot-generator. 1868e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org CHECK_EQ( 1869e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 0, StringCmp("Object", i::V8HeapExplorer::GetConstructorName(*js_obj3))); 1870ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> obj4 = js_global->Get(v8_str("obj4")).As<v8::Object>(); 1871ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org i::Handle<i::JSObject> js_obj4 = v8::Utils::OpenHandle(*obj4); 1872e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org // TODO(verwaest): Restore to Constructor4 once supported by the 1873e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org // heap-snapshot-generator. 1874e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org CHECK_EQ( 1875e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 0, StringCmp("Object", i::V8HeapExplorer::GetConstructorName(*js_obj4))); 1876ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> obj5 = js_global->Get(v8_str("obj5")).As<v8::Object>(); 1877ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org i::Handle<i::JSObject> js_obj5 = v8::Utils::OpenHandle(*obj5); 1878ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org CHECK_EQ(0, StringCmp( 1879ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "Object", i::V8HeapExplorer::GetConstructorName(*js_obj5))); 1880ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org v8::Local<v8::Object> obj6 = js_global->Get(v8_str("obj6")).As<v8::Object>(); 1881ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org i::Handle<i::JSObject> js_obj6 = v8::Utils::OpenHandle(*obj6); 1882ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org CHECK_EQ(0, StringCmp( 1883ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org "Object", i::V8HeapExplorer::GetConstructorName(*js_obj6))); 1884ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org} 188504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org 18860ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 18871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(FastCaseAccessors) { 18881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LocalContext env; 18891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org v8::HandleScope scope(env->GetIsolate()); 18901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 18911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompileRun("var obj1 = {};\n" 18931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "obj1.__defineGetter__('propWithGetter', function Y() {\n" 18941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org " return 42;\n" 18951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "});\n" 18961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "obj1.__defineSetter__('propWithSetter', function Z(value) {\n" 18971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org " return this.value_ = value;\n" 18981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "});\n"); 18991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::HeapSnapshot* snapshot = 19001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("fastCaseAccessors")); 1901ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 19021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 19041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_NE(NULL, global); 19051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::HeapGraphNode* obj1 = 19061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1"); 19071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_NE(NULL, obj1); 19081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::HeapGraphNode* func; 19091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithGetter"); 19101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_NE(NULL, func); 19111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithGetter"); 19121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_EQ(NULL, func); 19131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithSetter"); 19141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_NE(NULL, func); 19151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithSetter"); 19161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_EQ(NULL, func); 19171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 19181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(SlowCaseAccessors) { 192104e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org LocalContext env; 19222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1923f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 192404e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org 192504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org CompileRun("var obj1 = {};\n" 19261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org "for (var i = 0; i < 100; ++i) obj1['z' + i] = {};" 192704e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org "obj1.__defineGetter__('propWithGetter', function Y() {\n" 192804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org " return 42;\n" 192904e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org "});\n" 193004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org "obj1.__defineSetter__('propWithSetter', function Z(value) {\n" 193104e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org " return this.value_ = value;\n" 193204e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org "});\n"); 193304e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org const v8::HeapSnapshot* snapshot = 19341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("slowCaseAccessors")); 1935ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 193604e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org 193704e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 193804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org CHECK_NE(NULL, global); 193904e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org const v8::HeapGraphNode* obj1 = 1940ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1"); 194104e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org CHECK_NE(NULL, obj1); 19421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::HeapGraphNode* func; 19431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithGetter"); 19441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_NE(NULL, func); 19451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithGetter"); 19461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_EQ(NULL, func); 19471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithSetter"); 19481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_NE(NULL, func); 19491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithSetter"); 19501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_EQ(NULL, func); 195104e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org} 195264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 19531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1954c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.orgTEST(HiddenPropertiesFastCase) { 1955c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org LocalContext env; 19562bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1957f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1958c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org 1959c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org CompileRun( 1960c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org "function C(x) { this.a = this; this.b = x; }\n" 1961c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org "c = new C(2012);\n"); 1962c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org const v8::HeapSnapshot* snapshot = 1963f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("HiddenPropertiesFastCase1")); 1964ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1965c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1966c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org const v8::HeapGraphNode* c = 1967c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); 1968c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org CHECK_NE(NULL, c); 1969c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org const v8::HeapGraphNode* hidden_props = 1970c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org GetProperty(c, v8::HeapGraphEdge::kInternal, "hidden_properties"); 1971c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org CHECK_EQ(NULL, hidden_props); 1972c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org 1973f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Value> cHandle = 1974f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "c")); 1975c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org CHECK(!cHandle.IsEmpty() && cHandle->IsObject()); 1976000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org cHandle->ToObject()->SetHiddenValue(v8_str("key"), v8_str("val")); 1977c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org 1978f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org snapshot = heap_profiler->TakeHeapSnapshot( 1979c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org v8_str("HiddenPropertiesFastCase2")); 1980ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 1981c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org global = GetGlobalObject(snapshot); 1982c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); 1983c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org CHECK_NE(NULL, c); 1984c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, 1985c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org "hidden_properties"); 1986c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org CHECK_NE(NULL, hidden_props); 1987c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org} 198864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 1989e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 19906313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgTEST(AccessorInfo) { 19916313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org LocalContext env; 19926313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 19936313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 19946313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 19956313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CompileRun("function foo(x) { }\n"); 19966313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapSnapshot* snapshot = 19976313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("AccessorInfoTest")); 19986313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 19996313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 20006313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* foo = 20016313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "foo"); 20026313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, foo); 20036313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* map = 20046313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(foo, v8::HeapGraphEdge::kInternal, "map"); 20056313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, map); 20066313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* descriptors = 20076313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(map, v8::HeapGraphEdge::kInternal, "descriptors"); 20086313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, descriptors); 20096313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* length_name = 20106313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(descriptors, v8::HeapGraphEdge::kInternal, "2"); 20116313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, length_name); 20126313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_EQ("length", *v8::String::Utf8Value(length_name->GetName())); 20136313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* length_accessor = 20146313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(descriptors, v8::HeapGraphEdge::kInternal, "4"); 20156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, length_accessor); 20166313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_EQ("system / ExecutableAccessorInfo", 20176313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org *v8::String::Utf8Value(length_accessor->GetName())); 20186313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* name = 20196313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(length_accessor, v8::HeapGraphEdge::kInternal, "name"); 20206313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, name); 20216313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* getter = 20226313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(length_accessor, v8::HeapGraphEdge::kInternal, "getter"); 20236313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, getter); 20246313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org const v8::HeapGraphNode* setter = 20256313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org GetProperty(length_accessor, v8::HeapGraphEdge::kInternal, "setter"); 20266313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CHECK_NE(NULL, setter); 20276313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 20286313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 20296313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 203064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool HasWeakEdge(const v8::HeapGraphNode* node) { 203164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org for (int i = 0; i < node->GetChildrenCount(); ++i) { 203264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphEdge* handle_edge = node->GetChild(i); 203364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true; 203464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org } 203564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return false; 203664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 203764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 203864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 203964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool HasWeakGlobalHandle() { 2040528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 2041f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 204264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapSnapshot* snapshot = 2043f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("weaks")); 2044ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 204564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* gc_roots = GetNode( 2046c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); 204764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK_NE(NULL, gc_roots); 204864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* global_handles = GetNode( 2049c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); 205064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK_NE(NULL, global_handles); 205164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return HasWeakEdge(global_handles); 205264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 205364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 205464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 2055ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.orgstatic void PersistentHandleCallback( 2056ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { 2057ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data.GetParameter()->Reset(); 2058ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org delete data.GetParameter(); 205964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 206064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 206164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 206264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTEST(WeakGlobalHandle) { 206364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org LocalContext env; 20642bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 206564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 206664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK(!HasWeakGlobalHandle()); 206764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 206825530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org v8::Persistent<v8::Object> handle(env->GetIsolate(), 206925530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org v8::Object::New(env->GetIsolate())); 207025530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org handle.SetWeak(&handle, PersistentHandleCallback); 207164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 207264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK(HasWeakGlobalHandle()); 207364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 207464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 207564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 207664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTEST(SfiAndJsFunctionWeakRefs) { 207764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org LocalContext env; 20782bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2079f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 208064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 208164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CompileRun( 208264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org "fun = (function (x) { return function () { return x + 1; } })(1);"); 208364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapSnapshot* snapshot = 2084f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("fun")); 2085ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 208664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 208764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK_NE(NULL, global); 208864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* fun = 2089ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com GetProperty(global, v8::HeapGraphEdge::kProperty, "fun"); 2090ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(!HasWeakEdge(fun)); 209164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org const v8::HeapGraphNode* shared = 209264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared"); 2093ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(!HasWeakEdge(shared)); 209464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 2095bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 2096bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 2097fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgTEST(NoDebugObjectInSnapshot) { 2098fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org LocalContext env; 20992bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2100f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2101fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 21026a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org CHECK(CcTest::i_isolate()->debug()->Load()); 2103fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CompileRun("foo = {};"); 2104fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org const v8::HeapSnapshot* snapshot = 2105f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2106ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 2107fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org const v8::HeapGraphNode* root = snapshot->GetRoot(); 2108fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org int globals_count = 0; 2109fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org for (int i = 0; i < root->GetChildrenCount(); ++i) { 2110fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org const v8::HeapGraphEdge* edge = root->GetChild(i); 2111fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org if (edge->GetType() == v8::HeapGraphEdge::kShortcut) { 2112fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org ++globals_count; 2113fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org const v8::HeapGraphNode* global = edge->GetToNode(); 2114fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org const v8::HeapGraphNode* foo = 2115fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "foo"); 2116fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_NE(NULL, foo); 2117fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org } 2118fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org } 2119fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CHECK_EQ(1, globals_count); 2120fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org} 2121fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 2122fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 212388d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgTEST(AllStrongGcRootsHaveNames) { 212488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org LocalContext env; 21252bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2126f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 212788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org 212888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CompileRun("foo = {};"); 212988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapSnapshot* snapshot = 2130f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2131ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 213288d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphNode* gc_roots = GetNode( 2133c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); 213488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK_NE(NULL, gc_roots); 213588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphNode* strong_roots = GetNode( 2136c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org gc_roots, v8::HeapGraphNode::kSynthetic, "(Strong roots)"); 213788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK_NE(NULL, strong_roots); 213888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org for (int i = 0; i < strong_roots->GetChildrenCount(); ++i) { 213988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphEdge* edge = strong_roots->GetChild(i); 214088d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK_EQ(v8::HeapGraphEdge::kInternal, edge->GetType()); 2141906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value name(edge->GetName()); 214288d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK(isalpha(**name)); 214388d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org } 214488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org} 214588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org 214688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org 214788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgTEST(NoRefsToNonEssentialEntries) { 214888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org LocalContext env; 21492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2150f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 215188d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CompileRun("global_object = {};\n"); 215288d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapSnapshot* snapshot = 2153f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2154ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 215588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 215688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphNode* global_object = 215788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "global_object"); 215888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK_NE(NULL, global_object); 215988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphNode* properties = 216088d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org GetProperty(global_object, v8::HeapGraphEdge::kInternal, "properties"); 216188d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK_EQ(NULL, properties); 216288d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org const v8::HeapGraphNode* elements = 216388d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org GetProperty(global_object, v8::HeapGraphEdge::kInternal, "elements"); 216488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK_EQ(NULL, elements); 216588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org} 2166de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org 2167de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org 2168de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgTEST(MapHasDescriptorsAndTransitions) { 2169de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org LocalContext env; 21702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2171f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2172de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CompileRun("obj = { a: 10 };\n"); 2173de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org const v8::HeapSnapshot* snapshot = 2174f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2175ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 2176de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 2177de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org const v8::HeapGraphNode* global_object = 2178de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "obj"); 2179de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CHECK_NE(NULL, global_object); 218006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org 2181de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org const v8::HeapGraphNode* map = 2182de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map"); 2183de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org CHECK_NE(NULL, map); 218406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org const v8::HeapGraphNode* own_descriptors = GetProperty( 218506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org map, v8::HeapGraphEdge::kInternal, "descriptors"); 218689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org CHECK_NE(NULL, own_descriptors); 218706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org const v8::HeapGraphNode* own_transitions = GetProperty( 218806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org map, v8::HeapGraphEdge::kInternal, "transitions"); 218906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org CHECK_EQ(NULL, own_transitions); 2190de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org} 21912bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 21922bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 21932bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgTEST(ManyLocalsInSharedContext) { 21942bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org LocalContext env; 2195f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HandleScope scope(env->GetIsolate()); 2196f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 21972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int num_objects = 6000; 21982bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org CompileRun( 21992bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "var n = 6000;" 22002bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "var result = [];" 22012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "result.push('(function outer() {');" 22022bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "for (var i = 0; i < n; i++) {" 22032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org " var f = 'function f_' + i + '() { ';" 22042bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org " if (i > 0)" 22052bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org " f += 'f_' + (i - 1) + '();';" 22062bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org " f += ' }';" 22072bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org " result.push(f);" 22082bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "}" 22092bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "result.push('return f_' + (n - 1) + ';');" 22102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "result.push('})()');" 22112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org "var ok = eval(result.join('\\n'));"); 22122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org const v8::HeapSnapshot* snapshot = 2213f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2214ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 2215bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 22162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 22172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org CHECK_NE(NULL, global); 22182bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org const v8::HeapGraphNode* ok_object = 22192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "ok"); 22202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org CHECK_NE(NULL, ok_object); 22212bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org const v8::HeapGraphNode* context_object = 22222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org GetProperty(ok_object, v8::HeapGraphEdge::kInternal, "context"); 22232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org CHECK_NE(NULL, context_object); 22242bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // Check the objects are not duplicated in the context. 22252bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org CHECK_EQ(v8::internal::Context::MIN_CONTEXT_SLOTS + num_objects - 1, 22262bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org context_object->GetChildrenCount()); 22272bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // Check all the objects have got their names. 222837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org // ... well check just every 15th because otherwise it's too slow in debug. 222937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org for (int i = 0; i < num_objects - 1; i += 15) { 22302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org i::EmbeddedVector<char, 100> var_name; 223170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org i::SNPrintF(var_name, "f_%d", i); 22322bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org const v8::HeapGraphNode* f_object = GetProperty( 22332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org context_object, v8::HeapGraphEdge::kContextVariable, var_name.start()); 22342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org CHECK_NE(NULL, f_object); 22352bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 22362bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 2237bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 2238bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 2239bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgTEST(AllocationSitesAreVisible) { 2240bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org LocalContext env; 22410f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::Isolate* isolate = env->GetIsolate(); 22420f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::HandleScope scope(isolate); 22430f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 2244bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CompileRun( 2245bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org "fun = function () { var a = [3, 2, 1]; return a; }\n" 2246bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org "fun();"); 2247bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapSnapshot* snapshot = 2248bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2249ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 2250bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 2251bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 2252bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_NE(NULL, global); 2253bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphNode* fun_code = 2254bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "fun"); 2255bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_NE(NULL, fun_code); 2256bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphNode* literals = 2257bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org GetProperty(fun_code, v8::HeapGraphEdge::kInternal, "literals"); 2258bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_NE(NULL, literals); 2259bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, literals->GetType()); 2260bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_EQ(2, literals->GetChildrenCount()); 2261bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 2262bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org // The second value in the literals array should be the boilerplate, 2263bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org // after an AllocationSite. 2264bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphEdge* prop = literals->GetChild(1); 2265bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphNode* allocation_site = prop->GetToNode(); 2266bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org v8::String::Utf8Value name(allocation_site->GetName()); 2267bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_EQ("system / AllocationSite", *name); 2268bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphNode* transition_info = 2269bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org GetProperty(allocation_site, v8::HeapGraphEdge::kInternal, 2270bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org "transition_info"); 2271bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_NE(NULL, transition_info); 2272bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 2273bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const v8::HeapGraphNode* elements = 2274bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org GetProperty(transition_info, v8::HeapGraphEdge::kInternal, 2275bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org "elements"); 2276bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_NE(NULL, elements); 2277bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_EQ(v8::HeapGraphNode::kArray, elements->GetType()); 2278f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(v8::internal::FixedArray::SizeFor(3), 2279f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static_cast<int>(elements->GetShallowSize())); 2280bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 22814954674151afa960af66efb4831df06bde727333yangguo@chromium.org v8::Handle<v8::Value> array_val = 22824954674151afa960af66efb4831df06bde727333yangguo@chromium.org heap_profiler->FindObjectById(transition_info->GetId()); 22834954674151afa960af66efb4831df06bde727333yangguo@chromium.org CHECK(array_val->IsArray()); 22844954674151afa960af66efb4831df06bde727333yangguo@chromium.org v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(array_val); 2285bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org // Verify the array is "a" in the code above. 2286bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org CHECK_EQ(3, array->Length()); 22870f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CHECK_EQ(v8::Integer::New(isolate, 3), 22880f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org array->Get(v8::Integer::New(isolate, 0))); 22890f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CHECK_EQ(v8::Integer::New(isolate, 2), 22900f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org array->Get(v8::Integer::New(isolate, 1))); 22910f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org CHECK_EQ(v8::Integer::New(isolate, 1), 22920f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org array->Get(v8::Integer::New(isolate, 2))); 2293bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org} 2294ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 2295ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 2296ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgTEST(JSFunctionHasCodeLink) { 2297ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org LocalContext env; 2298ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org v8::HandleScope scope(env->GetIsolate()); 2299ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2300ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CompileRun("function foo(x, y) { return x + y; }\n"); 2301ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org const v8::HeapSnapshot* snapshot = 2302ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2303ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK(ValidateSnapshot(snapshot)); 2304ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 2305ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org const v8::HeapGraphNode* foo_func = 2306ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "foo"); 2307ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK_NE(NULL, foo_func); 2308ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org const v8::HeapGraphNode* code = 2309ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org GetProperty(foo_func, v8::HeapGraphEdge::kInternal, "code"); 2310ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org CHECK_NE(NULL, code); 2311ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} 2312a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2313a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2314057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgstatic const v8::HeapGraphNode* GetNodeByPath(const v8::HeapSnapshot* snapshot, 2315057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const char* path[], 2316057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org int depth) { 2317057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const v8::HeapGraphNode* node = snapshot->GetRoot(); 2318057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org for (int current_depth = 0; current_depth < depth; ++current_depth) { 2319057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org int i, count = node->GetChildrenCount(); 2320057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org for (i = 0; i < count; ++i) { 2321057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const v8::HeapGraphEdge* edge = node->GetChild(i); 2322057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const v8::HeapGraphNode* to_node = edge->GetToNode(); 2323057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org v8::String::Utf8Value edge_name(edge->GetName()); 2324057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org v8::String::Utf8Value node_name(to_node->GetName()); 2325057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org i::EmbeddedVector<char, 100> name; 232670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org i::SNPrintF(name, "%s::%s", *edge_name, *node_name); 2327057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org if (strstr(name.start(), path[current_depth])) { 2328057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org node = to_node; 2329e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org break; 2330e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org } 2331e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org } 2332057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org if (i == count) return NULL; 2333e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org } 2334e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org return node; 2335e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org} 2336e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 2337e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 2338057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgTEST(CheckCodeNames) { 2339e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org LocalContext env; 2340057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org v8::HandleScope scope(env->GetIsolate()); 2341e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2342057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org CompileRun("var a = 1.1;"); 2343057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const v8::HeapSnapshot* snapshot = 2344057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("CheckCodeNames")); 2345057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org CHECK(ValidateSnapshot(snapshot)); 2346057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2347057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const char* stub_path[] = { 2348057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org "::(GC roots)", 2349057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org "::(Strong roots)", 2350057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org "code_stubs::", 2351057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org "::(ArraySingleArgumentConstructorStub code)" 2352057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org }; 2353057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org const v8::HeapGraphNode* node = GetNodeByPath(snapshot, 2354fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org stub_path, arraysize(stub_path)); 2355057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org CHECK_NE(NULL, node); 2356057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 235709cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org const char* builtin_path1[] = { 235809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org "::(GC roots)", 235909cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org "::(Builtins)", 236009cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org "::(KeyedLoadIC_Generic builtin)" 236109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org }; 2362fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org node = GetNodeByPath(snapshot, builtin_path1, arraysize(builtin_path1)); 236309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org CHECK_NE(NULL, node); 236409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org 2365a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org const char* builtin_path2[] = {"::(GC roots)", "::(Builtins)", 2366a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org "::(CompileLazy builtin)"}; 2367fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org node = GetNodeByPath(snapshot, builtin_path2, arraysize(builtin_path2)); 2368e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org CHECK_NE(NULL, node); 236909cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org v8::String::Utf8Value node_name(node->GetName()); 2370a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CHECK_EQ("(CompileLazy builtin)", *node_name); 2371e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org} 2372b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2373b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2374b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgstatic const char* record_trace_tree_source = 2375b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"var topFunctions = [];\n" 2376b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"var global = this;\n" 2377b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"function generateFunctions(width, depth) {\n" 2378b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" var script = [];\n" 2379b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" for (var i = 0; i < width; i++) {\n" 2380b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" for (var j = 0; j < depth; j++) {\n" 2381b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push('function f_' + i + '_' + j + '(x) {\\n');\n" 2382b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push(' try {\\n');\n" 2383b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" if (j < depth-2) {\n" 2384b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push(' return f_' + i + '_' + (j+1) + '(x+1);\\n');\n" 2385b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" } else if (j == depth - 2) {\n" 2386b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push(' return new f_' + i + '_' + (depth - 1) + '();\\n');\n" 2387b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" } else if (j == depth - 1) {\n" 2388b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push(' this.ts = Date.now();\\n');\n" 2389b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" }\n" 2390b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push(' } catch (e) {}\\n');\n" 2391b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" script.push('}\\n');\n" 2392b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" \n" 2393b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" }\n" 2394b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" }\n" 2395b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" var script = script.join('');\n" 2396b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" // throw script;\n" 2397b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" global.eval(script);\n" 2398b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" for (var i = 0; i < width; i++) {\n" 2399b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" topFunctions.push(this['f_' + i + '_0']);\n" 2400b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" }\n" 2401b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"}\n" 2402b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"\n" 2403b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"var width = 3;\n" 2404b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"var depth = 3;\n" 2405b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"generateFunctions(width, depth);\n" 2406b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"var instances = [];\n" 2407b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"function start() {\n" 2408b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" for (var i = 0; i < width; i++) {\n" 2409b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" instances.push(topFunctions[i](0));\n" 2410b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org" }\n" 2411b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"}\n" 2412b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"\n" 2413b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org"for (var i = 0; i < 100; i++) start();\n"; 2414b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2415b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2416b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgstatic AllocationTraceNode* FindNode( 2417b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org AllocationTracker* tracker, const Vector<const char*>& names) { 2418b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org AllocationTraceNode* node = tracker->trace_tree()->root(); 2419b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org for (int i = 0; node != NULL && i < names.length(); i++) { 2420b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org const char* name = names[i]; 2421b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org Vector<AllocationTraceNode*> children = node->children(); 2422b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org node = NULL; 2423b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org for (int j = 0; j < children.length(); j++) { 2424ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org unsigned index = children[j]->function_info_index(); 2425ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org AllocationTracker::FunctionInfo* info = 2426ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org tracker->function_info_list()[index]; 2427b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org if (info && strcmp(info->name, name) == 0) { 2428b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org node = children[j]; 2429b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org break; 2430b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org } 2431b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org } 2432b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org } 2433b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org return node; 2434b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org} 2435b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2436b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2437cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgTEST(ArrayGrowLeftTrim) { 2438cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org LocalContext env; 2439cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org v8::HandleScope scope(env->GetIsolate()); 2440cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2441ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StartTrackingHeapObjects(true); 2442cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 2443cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org CompileRun( 2444cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org "var a = [];\n" 2445cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org "for (var i = 0; i < 5; ++i)\n" 2446cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org " a[i] = i;\n" 2447cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org "for (var i = 0; i < 3; ++i)\n" 2448cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org " a.shift();\n"); 2449cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 24503e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org const char* names[] = {""}; 2451ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org AllocationTracker* tracker = 2452ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); 2453cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org CHECK_NE(NULL, tracker); 2454cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org // Resolve all function locations. 2455cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org tracker->PrepareForSerialization(); 2456cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org // Print for better diagnostics in case of failure. 2457cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org tracker->trace_tree()->Print(tracker); 2458cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 2459cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org AllocationTraceNode* node = 2460fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org FindNode(tracker, Vector<const char*>(names, arraysize(names))); 2461cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org CHECK_NE(NULL, node); 2462cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org CHECK_GE(node->allocation_count(), 2); 2463cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org CHECK_GE(node->allocation_size(), 4 * 5); 2464ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StopTrackingHeapObjects(); 2465cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org} 2466cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 2467cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 2468b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgTEST(TrackHeapAllocations) { 2469b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org v8::HandleScope scope(v8::Isolate::GetCurrent()); 2470b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org LocalContext env; 2471b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2472b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2473ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StartTrackingHeapObjects(true); 2474b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2475b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org CompileRun(record_trace_tree_source); 2476b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 2477ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org AllocationTracker* tracker = 2478ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); 2479b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org CHECK_NE(NULL, tracker); 2480b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Resolve all function locations. 2481b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org tracker->PrepareForSerialization(); 2482b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Print for better diagnostics in case of failure. 2483b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org tracker->trace_tree()->Print(tracker); 2484b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 24853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org const char* names[] = {"", "start", "f_0_0", "f_0_1", "f_0_2"}; 2486b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org AllocationTraceNode* node = 2487fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org FindNode(tracker, Vector<const char*>(names, arraysize(names))); 2488b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org CHECK_NE(NULL, node); 2489b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org CHECK_GE(node->allocation_count(), 100); 2490b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); 2491ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StopTrackingHeapObjects(); 2492b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org} 2493ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2494ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2495ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.orgstatic const char* inline_heap_allocation_source = 2496ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"function f_0(x) {\n" 2497ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org" return f_1(x+1);\n" 2498ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"}\n" 2499ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"%NeverOptimizeFunction(f_0);\n" 2500ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"function f_1(x) {\n" 2501ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org" return new f_2(x+1);\n" 2502ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"}\n" 2503ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"function f_2(x) {\n" 2504ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org" this.foo = x;\n" 2505ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"}\n" 2506ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"var instances = [];\n" 2507ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"function start() {\n" 2508ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org" instances.push(f_0(0));\n" 2509ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"}\n" 2510ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"\n" 2511ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org"for (var i = 0; i < 100; i++) start();\n"; 2512ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2513ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2514ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.orgTEST(TrackBumpPointerAllocations) { 2515ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org i::FLAG_allow_natives_syntax = true; 2516ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org v8::HandleScope scope(v8::Isolate::GetCurrent()); 2517ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org LocalContext env; 2518ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2519ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 25203e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org const char* names[] = {"", "start", "f_0", "f_1"}; 2521ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // First check that normally all allocations are recorded. 2522ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org { 2523ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StartTrackingHeapObjects(true); 2524ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2525ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CompileRun(inline_heap_allocation_source); 2526ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2527ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org AllocationTracker* tracker = 2528ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); 2529ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_NE(NULL, tracker); 2530ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Resolve all function locations. 2531ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org tracker->PrepareForSerialization(); 2532ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Print for better diagnostics in case of failure. 2533ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org tracker->trace_tree()->Print(tracker); 2534ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2535ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org AllocationTraceNode* node = 2536fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org FindNode(tracker, Vector<const char*>(names, arraysize(names))); 2537ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_NE(NULL, node); 2538ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_GE(node->allocation_count(), 100); 2539ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); 2540ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StopTrackingHeapObjects(); 2541ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } 2542ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2543ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org { 2544ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StartTrackingHeapObjects(true); 2545ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2546ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Now check that not all allocations are tracked if we manually reenable 2547ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // inline allocations. 2548ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK(CcTest::heap()->inline_allocation_disabled()); 2549ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CcTest::heap()->EnableInlineAllocation(); 2550ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2551ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CompileRun(inline_heap_allocation_source); 2552ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2553ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org AllocationTracker* tracker = 2554ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); 2555ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_NE(NULL, tracker); 2556ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Resolve all function locations. 2557ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org tracker->PrepareForSerialization(); 2558ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Print for better diagnostics in case of failure. 2559ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org tracker->trace_tree()->Print(tracker); 2560ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2561ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org AllocationTraceNode* node = 2562fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org FindNode(tracker, Vector<const char*>(names, arraysize(names))); 2563ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_NE(NULL, node); 2564ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CHECK_LT(node->allocation_count(), 100); 2565ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2566ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CcTest::heap()->DisableInlineAllocation(); 2567ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org heap_profiler->StopTrackingHeapObjects(); 2568ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } 2569ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org} 2570af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 2571af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 2572ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgTEST(TrackV8ApiAllocation) { 2573ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org v8::HandleScope scope(v8::Isolate::GetCurrent()); 2574ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LocalContext env; 2575ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2576ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2577ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org const char* names[] = { "(V8 API)" }; 2578ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org heap_profiler->StartTrackingHeapObjects(true); 2579ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2580ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org v8::Handle<v8::Object> o1 = v8::Object::New(env->GetIsolate()); 2581ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org o1->Clone(); 2582ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2583ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org AllocationTracker* tracker = 2584ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); 2585ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_NE(NULL, tracker); 2586ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // Resolve all function locations. 2587ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org tracker->PrepareForSerialization(); 2588ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // Print for better diagnostics in case of failure. 2589ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org tracker->trace_tree()->Print(tracker); 2590ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2591ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org AllocationTraceNode* node = 2592fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org FindNode(tracker, Vector<const char*>(names, arraysize(names))); 2593ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_NE(NULL, node); 2594ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_GE(node->allocation_count(), 2); 2595ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); 2596ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org heap_profiler->StopTrackingHeapObjects(); 2597ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2598ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2599ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2600af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTEST(ArrayBufferAndArrayBufferView) { 2601af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org LocalContext env; 2602af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 2603af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 2604af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CompileRun("arr1 = new Uint32Array(100);\n"); 2605af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org const v8::HeapSnapshot* snapshot = 2606af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2607af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 2608af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 2609af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org const v8::HeapGraphNode* arr1_obj = 2610af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "arr1"); 2611af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CHECK_NE(NULL, arr1_obj); 2612af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org const v8::HeapGraphNode* arr1_buffer = 2613af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org GetProperty(arr1_obj, v8::HeapGraphEdge::kInternal, "buffer"); 2614af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CHECK_NE(NULL, arr1_buffer); 2615af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org const v8::HeapGraphNode* first_view = 2616af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org GetProperty(arr1_buffer, v8::HeapGraphEdge::kWeak, "weak_first_view"); 2617af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CHECK_NE(NULL, first_view); 2618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* backing_store = 2619f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GetProperty(arr1_buffer, v8::HeapGraphEdge::kInternal, "backing_store"); 2620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(NULL, backing_store); 2621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(400, static_cast<int>(backing_store->GetShallowSize())); 2622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgstatic int GetRetainersCount(const v8::HeapSnapshot* snapshot, 2626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* node) { 2627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int count = 0; 2628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0, l = snapshot->GetNodesCount(); i < l; ++i) { 2629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* parent = snapshot->GetNode(i); 2630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int j = 0, l2 = parent->GetChildrenCount(); j < l2; ++j) { 2631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (parent->GetChild(j)->GetToNode() == node) { 2632f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ++count; 2633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return count; 2637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2638f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(ArrayBufferSharedBackingStore) { 2641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LocalContext env; 2642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::Isolate* isolate = env->GetIsolate(); 2643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::HandleScope handle_scope(isolate); 2644f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 2645f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 1024); 2647f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); 2648f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK(!ab->IsExternal()); 2649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::ArrayBuffer::Contents ab_contents = ab->Externalize(); 2650f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK(ab->IsExternal()); 2651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); 2653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org void* data = ab_contents.Data(); 2654e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(data != NULL); 2655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::Local<v8::ArrayBuffer> ab2 = 2656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::ArrayBuffer::New(isolate, data, ab_contents.ByteLength()); 2657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK(ab2->IsExternal()); 2658f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org env->Global()->Set(v8_str("ab1"), ab); 2659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org env->Global()->Set(v8_str("ab2"), ab2); 2660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org v8::Handle<v8::Value> result = CompileRun("ab2.byteLength"); 2662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(1024, result->Int32Value()); 2663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2664f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapSnapshot* snapshot = 2665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 2666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK(ValidateSnapshot(snapshot)); 2667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 2668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* ab1_node = 2669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "ab1"); 2670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(NULL, ab1_node); 2671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* ab1_data = 2672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GetProperty(ab1_node, v8::HeapGraphEdge::kInternal, "backing_store"); 2673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(NULL, ab1_data); 2674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* ab2_node = 2675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "ab2"); 2676f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(NULL, ab2_node); 2677f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::HeapGraphNode* ab2_data = 2678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GetProperty(ab2_node, v8::HeapGraphEdge::kInternal, "backing_store"); 2679f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_NE(NULL, ab2_data); 2680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(ab1_data, ab2_data); 2681f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(2, GetRetainersCount(snapshot, ab1_data)); 2682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org free(data); 2683af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org} 26840a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org 26850a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org 26860a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.orgTEST(BoxObject) { 26870a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 26880a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org v8::HandleScope scope(isolate); 26890a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org LocalContext env; 26900a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org v8::Handle<v8::Object> global_proxy = env->Global(); 26910a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 26920a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org 26930a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org i::Factory* factory = CcTest::i_isolate()->factory(); 26942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org i::Handle<i::String> string = factory->NewStringFromStaticChars("string"); 26950a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org i::Handle<i::Object> box = factory->NewBox(string); 26960a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org global->Set(0, v8::ToApiHandle<v8::Object>(box)); 26970a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org 26980a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 26990a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org const v8::HeapSnapshot* snapshot = 27000a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 27010a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 27020a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); 27030a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org const v8::HeapGraphNode* box_node = 27040a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org GetProperty(global_node, v8::HeapGraphEdge::kElement, "0"); 27050a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org CHECK_NE(NULL, box_node); 27060a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org v8::String::Utf8Value box_node_name(box_node->GetName()); 27070a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org CHECK_EQ("system / Box", *box_node_name); 27080a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org const v8::HeapGraphNode* box_value = 27090a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org GetProperty(box_node, v8::HeapGraphEdge::kInternal, "value"); 27100a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org CHECK_NE(NULL, box_value); 27110a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org} 2712ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2713ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 27144edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgTEST(WeakContainers) { 27154edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org i::FLAG_allow_natives_syntax = true; 27164edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LocalContext env; 27174edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org v8::HandleScope scope(env->GetIsolate()); 27184edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!CcTest::i_isolate()->use_crankshaft()) return; 27194edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 27204edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org CompileRun( 27214edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org "function foo(a) { return a.x; }\n" 27224edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org "obj = {x : 123};\n" 27234edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org "foo(obj);\n" 27244edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org "foo(obj);\n" 27254edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org "%OptimizeFunctionOnNextCall(foo);\n" 27264edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org "foo(obj);\n"); 27274edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const v8::HeapSnapshot* snapshot = 27284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 27294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org CHECK(ValidateSnapshot(snapshot)); 27304edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 27314edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const v8::HeapGraphNode* obj = 27324edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org GetProperty(global, v8::HeapGraphEdge::kProperty, "obj"); 27334edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org CHECK_NE(NULL, obj); 27344edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const v8::HeapGraphNode* map = 27354edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org GetProperty(obj, v8::HeapGraphEdge::kInternal, "map"); 27364edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org CHECK_NE(NULL, map); 27374edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const v8::HeapGraphNode* dependent_code = 27384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org GetProperty(map, v8::HeapGraphEdge::kInternal, "dependent_code"); 27394edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!dependent_code) return; 27404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org int count = dependent_code->GetChildrenCount(); 27414edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org CHECK_NE(0, count); 27424edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org for (int i = 0; i < count; ++i) { 27434edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const v8::HeapGraphEdge* prop = dependent_code->GetChild(i); 27444edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org CHECK_EQ(v8::HeapGraphEdge::kWeak, prop->GetType()); 27454edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } 27464edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org} 27474edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org 27484edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org 2749ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgstatic inline i::Address ToAddress(int n) { 2750ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return reinterpret_cast<i::Address>(n); 2751ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2752ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2753ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2754ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgTEST(AddressToTraceMap) { 2755ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org i::AddressToTraceMap map; 2756ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2757ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, map.GetTraceNodeId(ToAddress(150))); 2758ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2759ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x100, 0x200) -> 1 2760ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x100), 0x100, 1U); 2761ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x50))); 2762ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(1, map.GetTraceNodeId(ToAddress(0x100))); 2763ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(1, map.GetTraceNodeId(ToAddress(0x150))); 2764ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x100 + 0x100))); 2765ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(1, static_cast<int>(map.size())); 2766ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2767ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x100, 0x200) -> 1, [0x200, 0x300) -> 2 2768ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x200), 0x100, 2U); 2769ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(2, map.GetTraceNodeId(ToAddress(0x2a0))); 2770ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(2, static_cast<int>(map.size())); 2771ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2772ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x100, 0x180) -> 1, [0x180, 0x280) -> 3, [0x280, 0x300) -> 2 2773ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x180), 0x100, 3U); 2774ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(1, map.GetTraceNodeId(ToAddress(0x17F))); 2775ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(2, map.GetTraceNodeId(ToAddress(0x280))); 2776ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(3, map.GetTraceNodeId(ToAddress(0x180))); 2777ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(3, static_cast<int>(map.size())); 2778ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2779ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x100, 0x180) -> 1, [0x180, 0x280) -> 3, [0x280, 0x300) -> 2, 2780ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x400, 0x500) -> 4 2781ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x400), 0x100, 4U); 2782ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(1, map.GetTraceNodeId(ToAddress(0x17F))); 2783ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(2, map.GetTraceNodeId(ToAddress(0x280))); 2784ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(3, map.GetTraceNodeId(ToAddress(0x180))); 2785ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(4, map.GetTraceNodeId(ToAddress(0x450))); 2786ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x500))); 2787ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x350))); 2788ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(4, static_cast<int>(map.size())); 2789ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2790ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x100, 0x180) -> 1, [0x180, 0x200) -> 3, [0x200, 0x600) -> 5 2791ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x200), 0x400, 5U); 2792ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(5, map.GetTraceNodeId(ToAddress(0x200))); 2793ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(5, map.GetTraceNodeId(ToAddress(0x400))); 2794ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(3, static_cast<int>(map.size())); 2795ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2796ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org // [0x100, 0x180) -> 1, [0x180, 0x200) -> 7, [0x200, 0x600) ->5 2797ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x180), 0x80, 6U); 2798ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.AddRange(ToAddress(0x180), 0x80, 7U); 2799ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(7, map.GetTraceNodeId(ToAddress(0x180))); 2800ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(5, map.GetTraceNodeId(ToAddress(0x200))); 2801ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(3, static_cast<int>(map.size())); 2802ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2803ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org map.Clear(); 2804ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, static_cast<int>(map.size())); 2805ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x400))); 2806ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2807