| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 bool has_B2; | 85 bool has_B2; |
| 86 bool has_C2; | 86 bool has_C2; |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 } // namespace | 89 } // namespace |
| 90 | 90 |
| 91 | 91 |
| 92 static const v8::HeapGraphNode* GetGlobalObject( | 92 static const v8::HeapGraphNode* GetGlobalObject( |
| 93 const v8::HeapSnapshot* snapshot) { | 93 const v8::HeapSnapshot* snapshot) { |
| 94 CHECK_EQ(2, snapshot->GetRoot()->GetChildrenCount()); | 94 CHECK_EQ(2, snapshot->GetRoot()->GetChildrenCount()); |
| 95 // The 0th-child is (GC Roots), 1st is the user root. |
| 95 const v8::HeapGraphNode* global_obj = | 96 const v8::HeapGraphNode* global_obj = |
| 96 snapshot->GetRoot()->GetChild(0)->GetToNode(); | 97 snapshot->GetRoot()->GetChild(1)->GetToNode(); |
| 97 CHECK_EQ(0, strncmp("Object", const_cast<i::HeapEntry*>( | 98 CHECK_EQ(0, strncmp("Object", const_cast<i::HeapEntry*>( |
| 98 reinterpret_cast<const i::HeapEntry*>(global_obj))->name(), 6)); | 99 reinterpret_cast<const i::HeapEntry*>(global_obj))->name(), 6)); |
| 99 return global_obj; | 100 return global_obj; |
| 100 } | 101 } |
| 101 | 102 |
| 102 | 103 |
| 103 static const v8::HeapGraphNode* GetProperty(const v8::HeapGraphNode* node, | 104 static const v8::HeapGraphNode* GetProperty(const v8::HeapGraphNode* node, |
| 104 v8::HeapGraphEdge::Type type, | 105 v8::HeapGraphEdge::Type type, |
| 105 const char* name) { | 106 const char* name) { |
| 106 for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { | 107 for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 const v8::HeapSnapshot* snapshot = | 333 const v8::HeapSnapshot* snapshot = |
| 333 heap_profiler->TakeHeapSnapshot(v8_str("numbers")); | 334 heap_profiler->TakeHeapSnapshot(v8_str("numbers")); |
| 334 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 335 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 335 CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); | 336 CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); |
| 336 const v8::HeapGraphNode* b = | 337 const v8::HeapGraphNode* b = |
| 337 GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); | 338 GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); |
| 338 CHECK_NE(NULL, b); | 339 CHECK_NE(NULL, b); |
| 339 CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); | 340 CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); |
| 340 } | 341 } |
| 341 | 342 |
| 343 |
| 342 TEST(HeapSnapshotSlicedString) { | 344 TEST(HeapSnapshotSlicedString) { |
| 343 LocalContext env; | 345 LocalContext env; |
| 344 v8::HandleScope scope(env->GetIsolate()); | 346 v8::HandleScope scope(env->GetIsolate()); |
| 345 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 347 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 346 CompileRun( | 348 CompileRun( |
| 347 "parent_string = \"123456789.123456789.123456789.123456789.123456789." | 349 "parent_string = \"123456789.123456789.123456789.123456789.123456789." |
| 348 "123456789.123456789.123456789.123456789.123456789." | 350 "123456789.123456789.123456789.123456789.123456789." |
| 349 "123456789.123456789.123456789.123456789.123456789." | 351 "123456789.123456789.123456789.123456789.123456789." |
| 350 "123456789.123456789.123456789.123456789.123456789.\";" | 352 "123456789.123456789.123456789.123456789.123456789.\";" |
| 351 "child_string = parent_string.slice(100);"); | 353 "child_string = parent_string.slice(100);"); |
| 352 const v8::HeapSnapshot* snapshot = | 354 const v8::HeapSnapshot* snapshot = |
| 353 heap_profiler->TakeHeapSnapshot(v8_str("strings")); | 355 heap_profiler->TakeHeapSnapshot(v8_str("strings")); |
| 354 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 356 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 355 const v8::HeapGraphNode* parent_string = | 357 const v8::HeapGraphNode* parent_string = |
| 356 GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string"); | 358 GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string"); |
| 357 CHECK_NE(NULL, parent_string); | 359 CHECK_NE(NULL, parent_string); |
| 358 const v8::HeapGraphNode* child_string = | 360 const v8::HeapGraphNode* child_string = |
| 359 GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string"); | 361 GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string"); |
| 360 CHECK_NE(NULL, child_string); | 362 CHECK_NE(NULL, child_string); |
| 361 const v8::HeapGraphNode* parent = | 363 const v8::HeapGraphNode* parent = |
| 362 GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent"); | 364 GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent"); |
| 363 CHECK_EQ(parent_string, parent); | 365 CHECK_EQ(parent_string, parent); |
| 364 } | 366 } |
| 365 | 367 |
| 368 |
| 366 TEST(HeapSnapshotInternalReferences) { | 369 TEST(HeapSnapshotInternalReferences) { |
| 367 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 370 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 368 v8::HandleScope scope(isolate); | 371 v8::HandleScope scope(isolate); |
| 369 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 372 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
| 370 global_template->SetInternalFieldCount(2); | 373 global_template->SetInternalFieldCount(2); |
| 371 LocalContext env(NULL, global_template); | 374 LocalContext env(NULL, global_template); |
| 372 v8::Handle<v8::Object> global_proxy = env->Global(); | 375 v8::Handle<v8::Object> global_proxy = env->Global(); |
| 373 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); | 376 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); |
| 374 CHECK_EQ(2, global->InternalFieldCount()); | 377 CHECK_EQ(2, global->InternalFieldCount()); |
| 375 v8::Local<v8::Object> obj = v8::Object::New(); | 378 v8::Local<v8::Object> obj = v8::Object::New(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); | 476 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); |
| 474 CHECK_NE(NULL, a2); | 477 CHECK_NE(NULL, a2); |
| 475 const v8::HeapGraphNode* k2 = | 478 const v8::HeapGraphNode* k2 = |
| 476 GetProperty(a2, v8::HeapGraphEdge::kInternal, "elements"); | 479 GetProperty(a2, v8::HeapGraphEdge::kInternal, "elements"); |
| 477 CHECK_NE(NULL, k2); | 480 CHECK_NE(NULL, k2); |
| 478 | 481 |
| 479 CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); | 482 CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); |
| 480 CHECK_EQ_SNAPSHOT_OBJECT_ID(k1->GetId(), k2->GetId()); | 483 CHECK_EQ_SNAPSHOT_OBJECT_ID(k1->GetId(), k2->GetId()); |
| 481 } | 484 } |
| 482 | 485 |
| 486 |
| 483 TEST(HeapEntryIdsAndGC) { | 487 TEST(HeapEntryIdsAndGC) { |
| 484 LocalContext env; | 488 LocalContext env; |
| 485 v8::HandleScope scope(env->GetIsolate()); | 489 v8::HandleScope scope(env->GetIsolate()); |
| 486 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 490 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 487 | 491 |
| 488 CompileRun( | 492 CompileRun( |
| 489 "function A() {}\n" | 493 "function A() {}\n" |
| 490 "function B(x) { this.x = x; }\n" | 494 "function B(x) { this.x = x; }\n" |
| 491 "var a = new A();\n" | 495 "var a = new A();\n" |
| 492 "var b = new B(a);"); | 496 "var b = new B(a);"); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 "var property_type =" | 655 "var property_type =" |
| 652 " meta.edge_types[edge_type_offset].indexOf('property');\n" | 656 " meta.edge_types[edge_type_offset].indexOf('property');\n" |
| 653 "var shortcut_type =" | 657 "var shortcut_type =" |
| 654 " meta.edge_types[edge_type_offset].indexOf('shortcut');\n" | 658 " meta.edge_types[edge_type_offset].indexOf('shortcut');\n" |
| 655 "var node_count = parsed.nodes.length / node_fields_count;\n" | 659 "var node_count = parsed.nodes.length / node_fields_count;\n" |
| 656 "var first_edge_indexes = parsed.first_edge_indexes = [];\n" | 660 "var first_edge_indexes = parsed.first_edge_indexes = [];\n" |
| 657 "for (var i = 0, first_edge_index = 0; i < node_count; ++i) {\n" | 661 "for (var i = 0, first_edge_index = 0; i < node_count; ++i) {\n" |
| 658 " first_edge_indexes[i] = first_edge_index;\n" | 662 " first_edge_indexes[i] = first_edge_index;\n" |
| 659 " first_edge_index += edge_fields_count *\n" | 663 " first_edge_index += edge_fields_count *\n" |
| 660 " parsed.nodes[i * node_fields_count + edge_count_offset];\n" | 664 " parsed.nodes[i * node_fields_count + edge_count_offset];\n" |
| 661 "}\n"); | 665 "}\n" |
| 666 "first_edge_indexes[node_count] = first_edge_index;\n"); |
| 662 CHECK(!meta_analysis_result.IsEmpty()); | 667 CHECK(!meta_analysis_result.IsEmpty()); |
| 663 | 668 |
| 664 // A helper function for processing encoded nodes. | 669 // A helper function for processing encoded nodes. |
| 665 CompileRun( | 670 CompileRun( |
| 666 "function GetChildPosByProperty(pos, prop_name, prop_type) {\n" | 671 "function GetChildPosByProperty(pos, prop_name, prop_type) {\n" |
| 667 " var nodes = parsed.nodes;\n" | 672 " var nodes = parsed.nodes;\n" |
| 668 " var edges = parsed.edges;\n" | 673 " var edges = parsed.edges;\n" |
| 669 " var strings = parsed.strings;\n" | 674 " var strings = parsed.strings;\n" |
| 670 " var node_ordinal = pos / node_fields_count;\n" | 675 " var node_ordinal = pos / node_fields_count;\n" |
| 671 " for (var i = parsed.first_edge_indexes[node_ordinal],\n" | 676 " for (var i = parsed.first_edge_indexes[node_ordinal],\n" |
| 672 " count = parsed.first_edge_indexes[node_ordinal + 1];\n" | 677 " count = parsed.first_edge_indexes[node_ordinal + 1];\n" |
| 673 " i < count; i += edge_fields_count) {\n" | 678 " i < count; i += edge_fields_count) {\n" |
| 674 " if (edges[i + edge_type_offset] === prop_type\n" | 679 " if (edges[i + edge_type_offset] === prop_type\n" |
| 675 " && strings[edges[i + edge_name_offset]] === prop_name)\n" | 680 " && strings[edges[i + edge_name_offset]] === prop_name)\n" |
| 676 " return edges[i + edge_to_node_offset];\n" | 681 " return edges[i + edge_to_node_offset];\n" |
| 677 " }\n" | 682 " }\n" |
| 678 " return null;\n" | 683 " return null;\n" |
| 679 "}\n"); | 684 "}\n"); |
| 680 // Get the string index using the path: <root> -> <global>.b.x.s | 685 // Get the string index using the path: <root> -> <global>.b.x.s |
| 681 v8::Local<v8::Value> string_obj_pos_val = CompileRun( | 686 v8::Local<v8::Value> string_obj_pos_val = CompileRun( |
| 682 "GetChildPosByProperty(\n" | 687 "GetChildPosByProperty(\n" |
| 683 " GetChildPosByProperty(\n" | 688 " GetChildPosByProperty(\n" |
| 684 " GetChildPosByProperty(" | 689 " GetChildPosByProperty(" |
| 685 " parsed.edges[edge_to_node_offset]," | 690 " parsed.edges[edge_fields_count + edge_to_node_offset]," |
| 686 " \"b\", property_type),\n" | 691 " \"b\", property_type),\n" |
| 687 " \"x\", property_type)," | 692 " \"x\", property_type)," |
| 688 " \"s\", property_type)"); | 693 " \"s\", property_type)"); |
| 689 CHECK(!string_obj_pos_val.IsEmpty()); | 694 CHECK(!string_obj_pos_val.IsEmpty()); |
| 690 int string_obj_pos = | 695 int string_obj_pos = |
| 691 static_cast<int>(string_obj_pos_val->ToNumber()->Value()); | 696 static_cast<int>(string_obj_pos_val->ToNumber()->Value()); |
| 692 v8::Local<v8::Object> nodes_array = | 697 v8::Local<v8::Object> nodes_array = |
| 693 parsed_snapshot->Get(v8_str("nodes"))->ToObject(); | 698 parsed_snapshot->Get(v8_str("nodes"))->ToObject(); |
| 694 int string_index = static_cast<int>( | 699 int string_index = static_cast<int>( |
| 695 nodes_array->Get(string_obj_pos + 1)->ToNumber()->Value()); | 700 nodes_array->Get(string_obj_pos + 1)->ToNumber()->Value()); |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 int done() { return done_; } | 1013 int done() { return done_; } |
| 1009 int total() { return total_; } | 1014 int total() { return total_; } |
| 1010 | 1015 |
| 1011 private: | 1016 private: |
| 1012 int done_; | 1017 int done_; |
| 1013 int total_; | 1018 int total_; |
| 1014 int abort_count_; | 1019 int abort_count_; |
| 1015 }; | 1020 }; |
| 1016 } | 1021 } |
| 1017 | 1022 |
| 1023 |
| 1018 TEST(TakeHeapSnapshotAborting) { | 1024 TEST(TakeHeapSnapshotAborting) { |
| 1019 LocalContext env; | 1025 LocalContext env; |
| 1020 v8::HandleScope scope(env->GetIsolate()); | 1026 v8::HandleScope scope(env->GetIsolate()); |
| 1021 | 1027 |
| 1022 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1028 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1023 const int snapshots_count = heap_profiler->GetSnapshotCount(); | 1029 const int snapshots_count = heap_profiler->GetSnapshotCount(); |
| 1024 TestActivityControl aborting_control(1); | 1030 TestActivityControl aborting_control(1); |
| 1025 const v8::HeapSnapshot* no_snapshot = | 1031 const v8::HeapSnapshot* no_snapshot = |
| 1026 heap_profiler->TakeHeapSnapshot(v8_str("abort"), | 1032 heap_profiler->TakeHeapSnapshot(v8_str("abort"), |
| 1027 &aborting_control); | 1033 &aborting_control); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1331 } | 1337 } |
| 1332 | 1338 |
| 1333 | 1339 |
| 1334 class NameResolver : public v8::HeapProfiler::ObjectNameResolver { | 1340 class NameResolver : public v8::HeapProfiler::ObjectNameResolver { |
| 1335 public: | 1341 public: |
| 1336 virtual const char* GetName(v8::Handle<v8::Object> object) { | 1342 virtual const char* GetName(v8::Handle<v8::Object> object) { |
| 1337 return "Global object name"; | 1343 return "Global object name"; |
| 1338 } | 1344 } |
| 1339 }; | 1345 }; |
| 1340 | 1346 |
| 1347 |
| 1341 TEST(GlobalObjectName) { | 1348 TEST(GlobalObjectName) { |
| 1342 LocalContext env; | 1349 LocalContext env; |
| 1343 v8::HandleScope scope(env->GetIsolate()); | 1350 v8::HandleScope scope(env->GetIsolate()); |
| 1344 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1351 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1345 | 1352 |
| 1346 CompileRun("document = { URL:\"abcdefgh\" };"); | 1353 CompileRun("document = { URL:\"abcdefgh\" };"); |
| 1347 | 1354 |
| 1348 NameResolver name_resolver; | 1355 NameResolver name_resolver; |
| 1349 const v8::HeapSnapshot* snapshot = | 1356 const v8::HeapSnapshot* snapshot = |
| 1350 heap_profiler->TakeHeapSnapshot(v8_str("document"), | 1357 heap_profiler->TakeHeapSnapshot(v8_str("document"), |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1597 snapshot = heap_profiler->TakeHeapSnapshot( | 1604 snapshot = heap_profiler->TakeHeapSnapshot( |
| 1598 v8_str("HiddenPropertiesFastCase2")); | 1605 v8_str("HiddenPropertiesFastCase2")); |
| 1599 global = GetGlobalObject(snapshot); | 1606 global = GetGlobalObject(snapshot); |
| 1600 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); | 1607 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); |
| 1601 CHECK_NE(NULL, c); | 1608 CHECK_NE(NULL, c); |
| 1602 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, | 1609 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, |
| 1603 "hidden_properties"); | 1610 "hidden_properties"); |
| 1604 CHECK_NE(NULL, hidden_props); | 1611 CHECK_NE(NULL, hidden_props); |
| 1605 } | 1612 } |
| 1606 | 1613 |
| 1614 |
| 1607 bool HasWeakEdge(const v8::HeapGraphNode* node) { | 1615 bool HasWeakEdge(const v8::HeapGraphNode* node) { |
| 1608 for (int i = 0; i < node->GetChildrenCount(); ++i) { | 1616 for (int i = 0; i < node->GetChildrenCount(); ++i) { |
| 1609 const v8::HeapGraphEdge* handle_edge = node->GetChild(i); | 1617 const v8::HeapGraphEdge* handle_edge = node->GetChild(i); |
| 1610 if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true; | 1618 if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true; |
| 1611 } | 1619 } |
| 1612 return false; | 1620 return false; |
| 1613 } | 1621 } |
| 1614 | 1622 |
| 1615 | 1623 |
| 1616 bool HasWeakGlobalHandle() { | 1624 bool HasWeakGlobalHandle() { |
| 1617 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 1625 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 1618 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); | 1626 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); |
| 1619 const v8::HeapSnapshot* snapshot = | 1627 const v8::HeapSnapshot* snapshot = |
| 1620 heap_profiler->TakeHeapSnapshot(v8_str("weaks")); | 1628 heap_profiler->TakeHeapSnapshot(v8_str("weaks")); |
| 1621 const v8::HeapGraphNode* gc_roots = GetNode( | 1629 const v8::HeapGraphNode* gc_roots = GetNode( |
| 1622 snapshot->GetRoot(), v8::HeapGraphNode::kObject, "(GC roots)"); | 1630 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); |
| 1623 CHECK_NE(NULL, gc_roots); | 1631 CHECK_NE(NULL, gc_roots); |
| 1624 const v8::HeapGraphNode* global_handles = GetNode( | 1632 const v8::HeapGraphNode* global_handles = GetNode( |
| 1625 gc_roots, v8::HeapGraphNode::kObject, "(Global handles)"); | 1633 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); |
| 1626 CHECK_NE(NULL, global_handles); | 1634 CHECK_NE(NULL, global_handles); |
| 1627 return HasWeakEdge(global_handles); | 1635 return HasWeakEdge(global_handles); |
| 1628 } | 1636 } |
| 1629 | 1637 |
| 1630 | 1638 |
| 1631 static void PersistentHandleCallback(v8::Isolate* isolate, | 1639 static void PersistentHandleCallback(v8::Isolate* isolate, |
| 1632 v8::Persistent<v8::Value>* handle, | 1640 v8::Persistent<v8::Value>* handle, |
| 1633 void*) { | 1641 void*) { |
| 1634 handle->Dispose(isolate); | 1642 handle->Dispose(isolate); |
| 1635 } | 1643 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1649 | 1657 |
| 1650 | 1658 |
| 1651 TEST(WeakNativeContextRefs) { | 1659 TEST(WeakNativeContextRefs) { |
| 1652 LocalContext env; | 1660 LocalContext env; |
| 1653 v8::HandleScope scope(env->GetIsolate()); | 1661 v8::HandleScope scope(env->GetIsolate()); |
| 1654 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1662 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1655 | 1663 |
| 1656 const v8::HeapSnapshot* snapshot = | 1664 const v8::HeapSnapshot* snapshot = |
| 1657 heap_profiler->TakeHeapSnapshot(v8_str("weaks")); | 1665 heap_profiler->TakeHeapSnapshot(v8_str("weaks")); |
| 1658 const v8::HeapGraphNode* gc_roots = GetNode( | 1666 const v8::HeapGraphNode* gc_roots = GetNode( |
| 1659 snapshot->GetRoot(), v8::HeapGraphNode::kObject, "(GC roots)"); | 1667 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); |
| 1660 CHECK_NE(NULL, gc_roots); | 1668 CHECK_NE(NULL, gc_roots); |
| 1661 const v8::HeapGraphNode* global_handles = GetNode( | 1669 const v8::HeapGraphNode* global_handles = GetNode( |
| 1662 gc_roots, v8::HeapGraphNode::kObject, "(Global handles)"); | 1670 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); |
| 1663 CHECK_NE(NULL, global_handles); | 1671 CHECK_NE(NULL, global_handles); |
| 1664 const v8::HeapGraphNode* native_context = GetNode( | 1672 const v8::HeapGraphNode* native_context = GetNode( |
| 1665 global_handles, v8::HeapGraphNode::kHidden, "system / NativeContext"); | 1673 global_handles, v8::HeapGraphNode::kHidden, "system / NativeContext"); |
| 1666 CHECK_NE(NULL, native_context); | 1674 CHECK_NE(NULL, native_context); |
| 1667 CHECK(HasWeakEdge(native_context)); | 1675 CHECK(HasWeakEdge(native_context)); |
| 1668 } | 1676 } |
| 1669 | 1677 |
| 1670 | 1678 |
| 1671 TEST(SfiAndJsFunctionWeakRefs) { | 1679 TEST(SfiAndJsFunctionWeakRefs) { |
| 1672 LocalContext env; | 1680 LocalContext env; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 | 1725 |
| 1718 TEST(AllStrongGcRootsHaveNames) { | 1726 TEST(AllStrongGcRootsHaveNames) { |
| 1719 LocalContext env; | 1727 LocalContext env; |
| 1720 v8::HandleScope scope(env->GetIsolate()); | 1728 v8::HandleScope scope(env->GetIsolate()); |
| 1721 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1729 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1722 | 1730 |
| 1723 CompileRun("foo = {};"); | 1731 CompileRun("foo = {};"); |
| 1724 const v8::HeapSnapshot* snapshot = | 1732 const v8::HeapSnapshot* snapshot = |
| 1725 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); | 1733 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); |
| 1726 const v8::HeapGraphNode* gc_roots = GetNode( | 1734 const v8::HeapGraphNode* gc_roots = GetNode( |
| 1727 snapshot->GetRoot(), v8::HeapGraphNode::kObject, "(GC roots)"); | 1735 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); |
| 1728 CHECK_NE(NULL, gc_roots); | 1736 CHECK_NE(NULL, gc_roots); |
| 1729 const v8::HeapGraphNode* strong_roots = GetNode( | 1737 const v8::HeapGraphNode* strong_roots = GetNode( |
| 1730 gc_roots, v8::HeapGraphNode::kObject, "(Strong roots)"); | 1738 gc_roots, v8::HeapGraphNode::kSynthetic, "(Strong roots)"); |
| 1731 CHECK_NE(NULL, strong_roots); | 1739 CHECK_NE(NULL, strong_roots); |
| 1732 for (int i = 0; i < strong_roots->GetChildrenCount(); ++i) { | 1740 for (int i = 0; i < strong_roots->GetChildrenCount(); ++i) { |
| 1733 const v8::HeapGraphEdge* edge = strong_roots->GetChild(i); | 1741 const v8::HeapGraphEdge* edge = strong_roots->GetChild(i); |
| 1734 CHECK_EQ(v8::HeapGraphEdge::kInternal, edge->GetType()); | 1742 CHECK_EQ(v8::HeapGraphEdge::kInternal, edge->GetType()); |
| 1735 v8::String::Utf8Value name(edge->GetName()); | 1743 v8::String::Utf8Value name(edge->GetName()); |
| 1736 CHECK(isalpha(**name)); | 1744 CHECK(isalpha(**name)); |
| 1737 } | 1745 } |
| 1738 } | 1746 } |
| 1739 | 1747 |
| 1740 | 1748 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1817 // Check all the objects have got their names. | 1825 // Check all the objects have got their names. |
| 1818 // ... well check just every 8th because otherwise it's too slow in debug. | 1826 // ... well check just every 8th because otherwise it's too slow in debug. |
| 1819 for (int i = 0; i < num_objects - 1; i += 8) { | 1827 for (int i = 0; i < num_objects - 1; i += 8) { |
| 1820 i::EmbeddedVector<char, 100> var_name; | 1828 i::EmbeddedVector<char, 100> var_name; |
| 1821 i::OS::SNPrintF(var_name, "f_%d", i); | 1829 i::OS::SNPrintF(var_name, "f_%d", i); |
| 1822 const v8::HeapGraphNode* f_object = GetProperty( | 1830 const v8::HeapGraphNode* f_object = GetProperty( |
| 1823 context_object, v8::HeapGraphEdge::kContextVariable, var_name.start()); | 1831 context_object, v8::HeapGraphEdge::kContextVariable, var_name.start()); |
| 1824 CHECK_NE(NULL, f_object); | 1832 CHECK_NE(NULL, f_object); |
| 1825 } | 1833 } |
| 1826 } | 1834 } |
| OLD | NEW |