| 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 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 const v8::HeapSnapshot* snapshot = | 333 const v8::HeapSnapshot* snapshot = |
| 334 heap_profiler->TakeHeapSnapshot(v8_str("numbers")); | 334 heap_profiler->TakeHeapSnapshot(v8_str("numbers")); |
| 335 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 335 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 336 CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); | 336 CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); |
| 337 const v8::HeapGraphNode* b = | 337 const v8::HeapGraphNode* b = |
| 338 GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); | 338 GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); |
| 339 CHECK_NE(NULL, b); | 339 CHECK_NE(NULL, b); |
| 340 CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); | 340 CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); |
| 341 } | 341 } |
| 342 | 342 |
| 343 |
| 343 TEST(HeapSnapshotSlicedString) { | 344 TEST(HeapSnapshotSlicedString) { |
| 344 LocalContext env; | 345 LocalContext env; |
| 345 v8::HandleScope scope(env->GetIsolate()); | 346 v8::HandleScope scope(env->GetIsolate()); |
| 346 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 347 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 347 CompileRun( | 348 CompileRun( |
| 348 "parent_string = \"123456789.123456789.123456789.123456789.123456789." | 349 "parent_string = \"123456789.123456789.123456789.123456789.123456789." |
| 349 "123456789.123456789.123456789.123456789.123456789." | 350 "123456789.123456789.123456789.123456789.123456789." |
| 350 "123456789.123456789.123456789.123456789.123456789." | 351 "123456789.123456789.123456789.123456789.123456789." |
| 351 "123456789.123456789.123456789.123456789.123456789.\";" | 352 "123456789.123456789.123456789.123456789.123456789.\";" |
| 352 "child_string = parent_string.slice(100);"); | 353 "child_string = parent_string.slice(100);"); |
| 353 const v8::HeapSnapshot* snapshot = | 354 const v8::HeapSnapshot* snapshot = |
| 354 heap_profiler->TakeHeapSnapshot(v8_str("strings")); | 355 heap_profiler->TakeHeapSnapshot(v8_str("strings")); |
| 355 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 356 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 356 const v8::HeapGraphNode* parent_string = | 357 const v8::HeapGraphNode* parent_string = |
| 357 GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string"); | 358 GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string"); |
| 358 CHECK_NE(NULL, parent_string); | 359 CHECK_NE(NULL, parent_string); |
| 359 const v8::HeapGraphNode* child_string = | 360 const v8::HeapGraphNode* child_string = |
| 360 GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string"); | 361 GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string"); |
| 361 CHECK_NE(NULL, child_string); | 362 CHECK_NE(NULL, child_string); |
| 362 const v8::HeapGraphNode* parent = | 363 const v8::HeapGraphNode* parent = |
| 363 GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent"); | 364 GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent"); |
| 364 CHECK_EQ(parent_string, parent); | 365 CHECK_EQ(parent_string, parent); |
| 365 } | 366 } |
| 366 | 367 |
| 368 |
| 367 TEST(HeapSnapshotInternalReferences) { | 369 TEST(HeapSnapshotInternalReferences) { |
| 368 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 370 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 369 v8::HandleScope scope(isolate); | 371 v8::HandleScope scope(isolate); |
| 370 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 372 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
| 371 global_template->SetInternalFieldCount(2); | 373 global_template->SetInternalFieldCount(2); |
| 372 LocalContext env(NULL, global_template); | 374 LocalContext env(NULL, global_template); |
| 373 v8::Handle<v8::Object> global_proxy = env->Global(); | 375 v8::Handle<v8::Object> global_proxy = env->Global(); |
| 374 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); | 376 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); |
| 375 CHECK_EQ(2, global->InternalFieldCount()); | 377 CHECK_EQ(2, global->InternalFieldCount()); |
| 376 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... |
| 474 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); | 476 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); |
| 475 CHECK_NE(NULL, a2); | 477 CHECK_NE(NULL, a2); |
| 476 const v8::HeapGraphNode* k2 = | 478 const v8::HeapGraphNode* k2 = |
| 477 GetProperty(a2, v8::HeapGraphEdge::kInternal, "elements"); | 479 GetProperty(a2, v8::HeapGraphEdge::kInternal, "elements"); |
| 478 CHECK_NE(NULL, k2); | 480 CHECK_NE(NULL, k2); |
| 479 | 481 |
| 480 CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); | 482 CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); |
| 481 CHECK_EQ_SNAPSHOT_OBJECT_ID(k1->GetId(), k2->GetId()); | 483 CHECK_EQ_SNAPSHOT_OBJECT_ID(k1->GetId(), k2->GetId()); |
| 482 } | 484 } |
| 483 | 485 |
| 486 |
| 484 TEST(HeapEntryIdsAndGC) { | 487 TEST(HeapEntryIdsAndGC) { |
| 485 LocalContext env; | 488 LocalContext env; |
| 486 v8::HandleScope scope(env->GetIsolate()); | 489 v8::HandleScope scope(env->GetIsolate()); |
| 487 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 490 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 488 | 491 |
| 489 CompileRun( | 492 CompileRun( |
| 490 "function A() {}\n" | 493 "function A() {}\n" |
| 491 "function B(x) { this.x = x; }\n" | 494 "function B(x) { this.x = x; }\n" |
| 492 "var a = new A();\n" | 495 "var a = new A();\n" |
| 493 "var b = new B(a);"); | 496 "var b = new B(a);"); |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1010 int done() { return done_; } | 1013 int done() { return done_; } |
| 1011 int total() { return total_; } | 1014 int total() { return total_; } |
| 1012 | 1015 |
| 1013 private: | 1016 private: |
| 1014 int done_; | 1017 int done_; |
| 1015 int total_; | 1018 int total_; |
| 1016 int abort_count_; | 1019 int abort_count_; |
| 1017 }; | 1020 }; |
| 1018 } | 1021 } |
| 1019 | 1022 |
| 1023 |
| 1020 TEST(TakeHeapSnapshotAborting) { | 1024 TEST(TakeHeapSnapshotAborting) { |
| 1021 LocalContext env; | 1025 LocalContext env; |
| 1022 v8::HandleScope scope(env->GetIsolate()); | 1026 v8::HandleScope scope(env->GetIsolate()); |
| 1023 | 1027 |
| 1024 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1028 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1025 const int snapshots_count = heap_profiler->GetSnapshotCount(); | 1029 const int snapshots_count = heap_profiler->GetSnapshotCount(); |
| 1026 TestActivityControl aborting_control(1); | 1030 TestActivityControl aborting_control(1); |
| 1027 const v8::HeapSnapshot* no_snapshot = | 1031 const v8::HeapSnapshot* no_snapshot = |
| 1028 heap_profiler->TakeHeapSnapshot(v8_str("abort"), | 1032 heap_profiler->TakeHeapSnapshot(v8_str("abort"), |
| 1029 &aborting_control); | 1033 &aborting_control); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 } | 1337 } |
| 1334 | 1338 |
| 1335 | 1339 |
| 1336 class NameResolver : public v8::HeapProfiler::ObjectNameResolver { | 1340 class NameResolver : public v8::HeapProfiler::ObjectNameResolver { |
| 1337 public: | 1341 public: |
| 1338 virtual const char* GetName(v8::Handle<v8::Object> object) { | 1342 virtual const char* GetName(v8::Handle<v8::Object> object) { |
| 1339 return "Global object name"; | 1343 return "Global object name"; |
| 1340 } | 1344 } |
| 1341 }; | 1345 }; |
| 1342 | 1346 |
| 1347 |
| 1343 TEST(GlobalObjectName) { | 1348 TEST(GlobalObjectName) { |
| 1344 LocalContext env; | 1349 LocalContext env; |
| 1345 v8::HandleScope scope(env->GetIsolate()); | 1350 v8::HandleScope scope(env->GetIsolate()); |
| 1346 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1351 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1347 | 1352 |
| 1348 CompileRun("document = { URL:\"abcdefgh\" };"); | 1353 CompileRun("document = { URL:\"abcdefgh\" };"); |
| 1349 | 1354 |
| 1350 NameResolver name_resolver; | 1355 NameResolver name_resolver; |
| 1351 const v8::HeapSnapshot* snapshot = | 1356 const v8::HeapSnapshot* snapshot = |
| 1352 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... |
| 1599 snapshot = heap_profiler->TakeHeapSnapshot( | 1604 snapshot = heap_profiler->TakeHeapSnapshot( |
| 1600 v8_str("HiddenPropertiesFastCase2")); | 1605 v8_str("HiddenPropertiesFastCase2")); |
| 1601 global = GetGlobalObject(snapshot); | 1606 global = GetGlobalObject(snapshot); |
| 1602 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); | 1607 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); |
| 1603 CHECK_NE(NULL, c); | 1608 CHECK_NE(NULL, c); |
| 1604 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, | 1609 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, |
| 1605 "hidden_properties"); | 1610 "hidden_properties"); |
| 1606 CHECK_NE(NULL, hidden_props); | 1611 CHECK_NE(NULL, hidden_props); |
| 1607 } | 1612 } |
| 1608 | 1613 |
| 1614 |
| 1609 bool HasWeakEdge(const v8::HeapGraphNode* node) { | 1615 bool HasWeakEdge(const v8::HeapGraphNode* node) { |
| 1610 for (int i = 0; i < node->GetChildrenCount(); ++i) { | 1616 for (int i = 0; i < node->GetChildrenCount(); ++i) { |
| 1611 const v8::HeapGraphEdge* handle_edge = node->GetChild(i); | 1617 const v8::HeapGraphEdge* handle_edge = node->GetChild(i); |
| 1612 if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true; | 1618 if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true; |
| 1613 } | 1619 } |
| 1614 return false; | 1620 return false; |
| 1615 } | 1621 } |
| 1616 | 1622 |
| 1617 | 1623 |
| 1618 bool HasWeakGlobalHandle() { | 1624 bool HasWeakGlobalHandle() { |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1819 // Check all the objects have got their names. | 1825 // Check all the objects have got their names. |
| 1820 // ... 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. |
| 1821 for (int i = 0; i < num_objects - 1; i += 8) { | 1827 for (int i = 0; i < num_objects - 1; i += 8) { |
| 1822 i::EmbeddedVector<char, 100> var_name; | 1828 i::EmbeddedVector<char, 100> var_name; |
| 1823 i::OS::SNPrintF(var_name, "f_%d", i); | 1829 i::OS::SNPrintF(var_name, "f_%d", i); |
| 1824 const v8::HeapGraphNode* f_object = GetProperty( | 1830 const v8::HeapGraphNode* f_object = GetProperty( |
| 1825 context_object, v8::HeapGraphEdge::kContextVariable, var_name.start()); | 1831 context_object, v8::HeapGraphEdge::kContextVariable, var_name.start()); |
| 1826 CHECK_NE(NULL, f_object); | 1832 CHECK_NE(NULL, f_object); |
| 1827 } | 1833 } |
| 1828 } | 1834 } |
| OLD | NEW |