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