OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // | 2 // |
3 // Tests for heap profiler | 3 // Tests for heap profiler |
4 | 4 |
5 #include <ctype.h> | 5 #include <ctype.h> |
6 | 6 |
7 #include "v8.h" | 7 #include "v8.h" |
8 | 8 |
9 #include "cctest.h" | 9 #include "cctest.h" |
10 #include "hashmap.h" | 10 #include "hashmap.h" |
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 return node; | 1038 return node; |
1039 } | 1039 } |
1040 } | 1040 } |
1041 return NULL; | 1041 return NULL; |
1042 } | 1042 } |
1043 | 1043 |
1044 | 1044 |
1045 TEST(HeapSnapshotRetainedObjectInfo) { | 1045 TEST(HeapSnapshotRetainedObjectInfo) { |
1046 v8::HandleScope scope; | 1046 v8::HandleScope scope; |
1047 LocalContext env; | 1047 LocalContext env; |
| 1048 v8::Isolate* isolate = env->GetIsolate(); |
1048 | 1049 |
1049 v8::HeapProfiler::DefineWrapperClass( | 1050 v8::HeapProfiler::DefineWrapperClass( |
1050 1, TestRetainedObjectInfo::WrapperInfoCallback); | 1051 1, TestRetainedObjectInfo::WrapperInfoCallback); |
1051 v8::HeapProfiler::DefineWrapperClass( | 1052 v8::HeapProfiler::DefineWrapperClass( |
1052 2, TestRetainedObjectInfo::WrapperInfoCallback); | 1053 2, TestRetainedObjectInfo::WrapperInfoCallback); |
1053 v8::Persistent<v8::String> p_AAA = | 1054 v8::Persistent<v8::String> p_AAA = |
1054 v8::Persistent<v8::String>::New(v8_str("AAA")); | 1055 v8::Persistent<v8::String>::New(isolate, v8_str("AAA")); |
1055 p_AAA.SetWrapperClassId(1); | 1056 p_AAA.SetWrapperClassId(isolate, 1); |
1056 v8::Persistent<v8::String> p_BBB = | 1057 v8::Persistent<v8::String> p_BBB = |
1057 v8::Persistent<v8::String>::New(v8_str("BBB")); | 1058 v8::Persistent<v8::String>::New(isolate, v8_str("BBB")); |
1058 p_BBB.SetWrapperClassId(1); | 1059 p_BBB.SetWrapperClassId(isolate, 1); |
1059 v8::Persistent<v8::String> p_CCC = | 1060 v8::Persistent<v8::String> p_CCC = |
1060 v8::Persistent<v8::String>::New(v8_str("CCC")); | 1061 v8::Persistent<v8::String>::New(isolate, v8_str("CCC")); |
1061 p_CCC.SetWrapperClassId(2); | 1062 p_CCC.SetWrapperClassId(isolate, 2); |
1062 CHECK_EQ(0, TestRetainedObjectInfo::instances.length()); | 1063 CHECK_EQ(0, TestRetainedObjectInfo::instances.length()); |
1063 const v8::HeapSnapshot* snapshot = | 1064 const v8::HeapSnapshot* snapshot = |
1064 v8::HeapProfiler::TakeSnapshot(v8_str("retained")); | 1065 v8::HeapProfiler::TakeSnapshot(v8_str("retained")); |
1065 | 1066 |
1066 CHECK_EQ(3, TestRetainedObjectInfo::instances.length()); | 1067 CHECK_EQ(3, TestRetainedObjectInfo::instances.length()); |
1067 for (int i = 0; i < TestRetainedObjectInfo::instances.length(); ++i) { | 1068 for (int i = 0; i < TestRetainedObjectInfo::instances.length(); ++i) { |
1068 CHECK(TestRetainedObjectInfo::instances[i]->disposed()); | 1069 CHECK(TestRetainedObjectInfo::instances[i]->disposed()); |
1069 delete TestRetainedObjectInfo::instances[i]; | 1070 delete TestRetainedObjectInfo::instances[i]; |
1070 } | 1071 } |
1071 | 1072 |
(...skipping 28 matching lines...) Expand all Loading... |
1100 CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "native")); | 1101 CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "native")); |
1101 } | 1102 } |
1102 | 1103 |
1103 | 1104 |
1104 class GraphWithImplicitRefs { | 1105 class GraphWithImplicitRefs { |
1105 public: | 1106 public: |
1106 static const int kObjectsCount = 4; | 1107 static const int kObjectsCount = 4; |
1107 explicit GraphWithImplicitRefs(LocalContext* env) { | 1108 explicit GraphWithImplicitRefs(LocalContext* env) { |
1108 CHECK_EQ(NULL, instance_); | 1109 CHECK_EQ(NULL, instance_); |
1109 instance_ = this; | 1110 instance_ = this; |
| 1111 v8::Isolate* isolate = (*env)->GetIsolate(); |
1110 for (int i = 0; i < kObjectsCount; i++) { | 1112 for (int i = 0; i < kObjectsCount; i++) { |
1111 objects_[i] = v8::Persistent<v8::Object>::New(v8::Object::New()); | 1113 objects_[i] = v8::Persistent<v8::Object>::New(isolate, v8::Object::New()); |
1112 } | 1114 } |
1113 (*env)->Global()->Set(v8_str("root_object"), objects_[0]); | 1115 (*env)->Global()->Set(v8_str("root_object"), objects_[0]); |
1114 } | 1116 } |
1115 ~GraphWithImplicitRefs() { | 1117 ~GraphWithImplicitRefs() { |
1116 instance_ = NULL; | 1118 instance_ = NULL; |
1117 } | 1119 } |
1118 | 1120 |
1119 static void gcPrologue(v8::GCType type, v8::GCCallbackFlags flags) { | 1121 static void gcPrologue(v8::GCType type, v8::GCCallbackFlags flags) { |
1120 instance_->AddImplicitReferences(); | 1122 instance_->AddImplicitReferences(); |
1121 } | 1123 } |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1471 const v8::HeapGraphNode* gc_roots = GetNode( | 1473 const v8::HeapGraphNode* gc_roots = GetNode( |
1472 snapshot->GetRoot(), v8::HeapGraphNode::kObject, "(GC roots)"); | 1474 snapshot->GetRoot(), v8::HeapGraphNode::kObject, "(GC roots)"); |
1473 CHECK_NE(NULL, gc_roots); | 1475 CHECK_NE(NULL, gc_roots); |
1474 const v8::HeapGraphNode* global_handles = GetNode( | 1476 const v8::HeapGraphNode* global_handles = GetNode( |
1475 gc_roots, v8::HeapGraphNode::kObject, "(Global handles)"); | 1477 gc_roots, v8::HeapGraphNode::kObject, "(Global handles)"); |
1476 CHECK_NE(NULL, global_handles); | 1478 CHECK_NE(NULL, global_handles); |
1477 return HasWeakEdge(global_handles); | 1479 return HasWeakEdge(global_handles); |
1478 } | 1480 } |
1479 | 1481 |
1480 | 1482 |
1481 static void PersistentHandleCallback(v8::Persistent<v8::Value> handle, void*) { | 1483 static void PersistentHandleCallback(v8::Isolate* isolate, |
1482 handle.Dispose(); | 1484 v8::Persistent<v8::Value> handle, |
| 1485 void*) { |
| 1486 handle.Dispose(isolate); |
1483 } | 1487 } |
1484 | 1488 |
1485 | 1489 |
1486 TEST(WeakGlobalHandle) { | 1490 TEST(WeakGlobalHandle) { |
1487 v8::HandleScope scope; | 1491 v8::HandleScope scope; |
1488 LocalContext env; | 1492 LocalContext env; |
1489 | 1493 |
1490 CHECK(!HasWeakGlobalHandle()); | 1494 CHECK(!HasWeakGlobalHandle()); |
1491 | 1495 |
1492 v8::Persistent<v8::Object> handle = | 1496 v8::Persistent<v8::Object> handle = |
1493 v8::Persistent<v8::Object>::New(v8::Object::New()); | 1497 v8::Persistent<v8::Object>::New(env->GetIsolate(), v8::Object::New()); |
1494 handle.MakeWeak(NULL, PersistentHandleCallback); | 1498 handle.MakeWeak(env->GetIsolate(), NULL, PersistentHandleCallback); |
1495 | 1499 |
1496 CHECK(HasWeakGlobalHandle()); | 1500 CHECK(HasWeakGlobalHandle()); |
1497 } | 1501 } |
1498 | 1502 |
1499 | 1503 |
1500 TEST(WeakNativeContextRefs) { | 1504 TEST(WeakNativeContextRefs) { |
1501 v8::HandleScope scope; | 1505 v8::HandleScope scope; |
1502 LocalContext env; | 1506 LocalContext env; |
1503 | 1507 |
1504 const v8::HeapSnapshot* snapshot = | 1508 const v8::HeapSnapshot* snapshot = |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1557 } | 1561 } |
1558 } | 1562 } |
1559 CHECK_EQ(1, globals_count); | 1563 CHECK_EQ(1, globals_count); |
1560 } | 1564 } |
1561 #endif // ENABLE_DEBUGGER_SUPPORT | 1565 #endif // ENABLE_DEBUGGER_SUPPORT |
1562 | 1566 |
1563 | 1567 |
1564 TEST(PersistentHandleCount) { | 1568 TEST(PersistentHandleCount) { |
1565 v8::HandleScope scope; | 1569 v8::HandleScope scope; |
1566 LocalContext env; | 1570 LocalContext env; |
| 1571 v8::Isolate* isolate = env->GetIsolate(); |
1567 | 1572 |
1568 // V8 also uses global handles internally, so we can't test for an absolute | 1573 // V8 also uses global handles internally, so we can't test for an absolute |
1569 // number. | 1574 // number. |
1570 int global_handle_count = v8::HeapProfiler::GetPersistentHandleCount(); | 1575 int global_handle_count = v8::HeapProfiler::GetPersistentHandleCount(); |
1571 | 1576 |
1572 // Create some persistent handles. | 1577 // Create some persistent handles. |
1573 v8::Persistent<v8::String> p_AAA = | 1578 v8::Persistent<v8::String> p_AAA = |
1574 v8::Persistent<v8::String>::New(v8_str("AAA")); | 1579 v8::Persistent<v8::String>::New(isolate, v8_str("AAA")); |
1575 CHECK_EQ(global_handle_count + 1, | 1580 CHECK_EQ(global_handle_count + 1, |
1576 v8::HeapProfiler::GetPersistentHandleCount()); | 1581 v8::HeapProfiler::GetPersistentHandleCount()); |
1577 v8::Persistent<v8::String> p_BBB = | 1582 v8::Persistent<v8::String> p_BBB = |
1578 v8::Persistent<v8::String>::New(v8_str("BBB")); | 1583 v8::Persistent<v8::String>::New(isolate, v8_str("BBB")); |
1579 CHECK_EQ(global_handle_count + 2, | 1584 CHECK_EQ(global_handle_count + 2, |
1580 v8::HeapProfiler::GetPersistentHandleCount()); | 1585 v8::HeapProfiler::GetPersistentHandleCount()); |
1581 v8::Persistent<v8::String> p_CCC = | 1586 v8::Persistent<v8::String> p_CCC = |
1582 v8::Persistent<v8::String>::New(v8_str("CCC")); | 1587 v8::Persistent<v8::String>::New(isolate, v8_str("CCC")); |
1583 CHECK_EQ(global_handle_count + 3, | 1588 CHECK_EQ(global_handle_count + 3, |
1584 v8::HeapProfiler::GetPersistentHandleCount()); | 1589 v8::HeapProfiler::GetPersistentHandleCount()); |
1585 | 1590 |
1586 // Dipose the persistent handles in a different order. | 1591 // Dipose the persistent handles in a different order. |
1587 p_AAA.Dispose(); | 1592 p_AAA.Dispose(env->GetIsolate()); |
1588 CHECK_EQ(global_handle_count + 2, | 1593 CHECK_EQ(global_handle_count + 2, |
1589 v8::HeapProfiler::GetPersistentHandleCount()); | 1594 v8::HeapProfiler::GetPersistentHandleCount()); |
1590 p_CCC.Dispose(); | 1595 p_CCC.Dispose(env->GetIsolate()); |
1591 CHECK_EQ(global_handle_count + 1, | 1596 CHECK_EQ(global_handle_count + 1, |
1592 v8::HeapProfiler::GetPersistentHandleCount()); | 1597 v8::HeapProfiler::GetPersistentHandleCount()); |
1593 p_BBB.Dispose(); | 1598 p_BBB.Dispose(env->GetIsolate()); |
1594 CHECK_EQ(global_handle_count, v8::HeapProfiler::GetPersistentHandleCount()); | 1599 CHECK_EQ(global_handle_count, v8::HeapProfiler::GetPersistentHandleCount()); |
1595 } | 1600 } |
1596 | 1601 |
1597 | 1602 |
1598 TEST(AllStrongGcRootsHaveNames) { | 1603 TEST(AllStrongGcRootsHaveNames) { |
1599 v8::HandleScope scope; | 1604 v8::HandleScope scope; |
1600 LocalContext env; | 1605 LocalContext env; |
1601 | 1606 |
1602 CompileRun("foo = {};"); | 1607 CompileRun("foo = {};"); |
1603 const v8::HeapSnapshot* snapshot = | 1608 const v8::HeapSnapshot* snapshot = |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1650 const v8::HeapGraphNode* map = | 1655 const v8::HeapGraphNode* map = |
1651 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map"); | 1656 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map"); |
1652 CHECK_NE(NULL, map); | 1657 CHECK_NE(NULL, map); |
1653 const v8::HeapGraphNode* own_descriptors = GetProperty( | 1658 const v8::HeapGraphNode* own_descriptors = GetProperty( |
1654 map, v8::HeapGraphEdge::kInternal, "descriptors"); | 1659 map, v8::HeapGraphEdge::kInternal, "descriptors"); |
1655 CHECK_NE(NULL, own_descriptors); | 1660 CHECK_NE(NULL, own_descriptors); |
1656 const v8::HeapGraphNode* own_transitions = GetProperty( | 1661 const v8::HeapGraphNode* own_transitions = GetProperty( |
1657 map, v8::HeapGraphEdge::kInternal, "transitions"); | 1662 map, v8::HeapGraphEdge::kInternal, "transitions"); |
1658 CHECK_EQ(NULL, own_transitions); | 1663 CHECK_EQ(NULL, own_transitions); |
1659 } | 1664 } |
OLD | NEW |