OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // | 2 // |
3 // Tests for heap profiler | 3 // Tests for heap profiler |
4 | 4 |
5 #ifdef ENABLE_LOGGING_AND_PROFILING | 5 #ifdef ENABLE_LOGGING_AND_PROFILING |
6 | 6 |
7 #include "v8.h" | 7 #include "v8.h" |
8 #include "heap-profiler.h" | 8 #include "heap-profiler.h" |
9 #include "snapshot.h" | 9 #include "snapshot.h" |
10 #include "string-stream.h" | 10 #include "string-stream.h" |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 "function X(a, b) { this.a = a; this.b = b; }\n" | 587 "function X(a, b) { this.a = a; this.b = b; }\n" |
588 "x = new X(new X(), new X());\n" | 588 "x = new X(new X(), new X());\n" |
589 "x.a.a = x.b;"); | 589 "x.a.a = x.b;"); |
590 const v8::HeapSnapshot* snapshot = | 590 const v8::HeapSnapshot* snapshot = |
591 v8::HeapProfiler::TakeSnapshot(v8::String::New("sizes")); | 591 v8::HeapProfiler::TakeSnapshot(v8::String::New("sizes")); |
592 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 592 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
593 const v8::HeapGraphNode* x = | 593 const v8::HeapGraphNode* x = |
594 GetProperty(global, v8::HeapGraphEdge::kProperty, "x"); | 594 GetProperty(global, v8::HeapGraphEdge::kProperty, "x"); |
595 CHECK_NE(NULL, x); | 595 CHECK_NE(NULL, x); |
596 const v8::HeapGraphNode* x_prototype = | 596 const v8::HeapGraphNode* x_prototype = |
597 GetProperty(x, v8::HeapGraphEdge::kProperty, "prototype"); | 597 GetProperty(x, v8::HeapGraphEdge::kProperty, "__proto__"); |
598 CHECK_NE(NULL, x_prototype); | 598 CHECK_NE(NULL, x_prototype); |
599 const v8::HeapGraphNode* x1 = | 599 const v8::HeapGraphNode* x1 = |
600 GetProperty(x, v8::HeapGraphEdge::kProperty, "a"); | 600 GetProperty(x, v8::HeapGraphEdge::kProperty, "a"); |
601 CHECK_NE(NULL, x1); | 601 CHECK_NE(NULL, x1); |
602 const v8::HeapGraphNode* x2 = | 602 const v8::HeapGraphNode* x2 = |
603 GetProperty(x, v8::HeapGraphEdge::kProperty, "b"); | 603 GetProperty(x, v8::HeapGraphEdge::kProperty, "b"); |
604 CHECK_NE(NULL, x2); | 604 CHECK_NE(NULL, x2); |
605 CHECK_EQ( | 605 CHECK_EQ( |
606 x->GetSelfSize() * 3, | 606 x->GetSelfSize() * 3, |
607 x->GetReachableSize() - x_prototype->GetReachableSize()); | 607 x->GetReachableSize() - x_prototype->GetReachableSize()); |
608 CHECK_EQ( | 608 CHECK_EQ( |
609 x->GetSelfSize() * 3 + x_prototype->GetSelfSize(), x->GetRetainedSize()); | 609 x->GetSelfSize() * 3, x->GetRetainedSize()); |
610 CHECK_EQ( | 610 CHECK_EQ( |
611 x1->GetSelfSize() * 2, | 611 x1->GetSelfSize() * 2, |
612 x1->GetReachableSize() - x_prototype->GetReachableSize()); | 612 x1->GetReachableSize() - x_prototype->GetReachableSize()); |
613 CHECK_EQ( | 613 CHECK_EQ( |
614 x1->GetSelfSize(), x1->GetRetainedSize()); | 614 x1->GetSelfSize(), x1->GetRetainedSize()); |
615 CHECK_EQ( | 615 CHECK_EQ( |
616 x2->GetSelfSize(), | 616 x2->GetSelfSize(), |
617 x2->GetReachableSize() - x_prototype->GetReachableSize()); | 617 x2->GetReachableSize() - x_prototype->GetReachableSize()); |
618 CHECK_EQ( | 618 CHECK_EQ( |
619 x2->GetSelfSize(), x2->GetRetainedSize()); | 619 x2->GetSelfSize(), x2->GetRetainedSize()); |
(...skipping 24 matching lines...) Expand all Loading... |
644 } | 644 } |
645 | 645 |
646 | 646 |
647 TEST(HeapSnapshotCodeObjects) { | 647 TEST(HeapSnapshotCodeObjects) { |
648 v8::HandleScope scope; | 648 v8::HandleScope scope; |
649 LocalContext env; | 649 LocalContext env; |
650 | 650 |
651 CompileAndRunScript( | 651 CompileAndRunScript( |
652 "function lazy(x) { return x - 1; }\n" | 652 "function lazy(x) { return x - 1; }\n" |
653 "function compiled(x) { return x + 1; }\n" | 653 "function compiled(x) { return x + 1; }\n" |
654 "var inferred = function(x) { return x; }\n" | |
655 "var anonymous = (function() { return function() { return 0; } })();\n" | 654 "var anonymous = (function() { return function() { return 0; } })();\n" |
656 "compiled(1)"); | 655 "compiled(1)"); |
657 const v8::HeapSnapshot* snapshot = | 656 const v8::HeapSnapshot* snapshot = |
658 v8::HeapProfiler::TakeSnapshot(v8::String::New("code")); | 657 v8::HeapProfiler::TakeSnapshot(v8::String::New("code")); |
659 | 658 |
660 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 659 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
661 const v8::HeapGraphNode* compiled = | 660 const v8::HeapGraphNode* compiled = |
662 GetProperty(global, v8::HeapGraphEdge::kProperty, "compiled"); | 661 GetProperty(global, v8::HeapGraphEdge::kProperty, "compiled"); |
663 CHECK_NE(NULL, compiled); | 662 CHECK_NE(NULL, compiled); |
664 CHECK_EQ(v8::HeapGraphNode::kClosure, compiled->GetType()); | 663 CHECK_EQ(v8::HeapGraphNode::kClosure, compiled->GetType()); |
665 const v8::HeapGraphNode* lazy = | 664 const v8::HeapGraphNode* lazy = |
666 GetProperty(global, v8::HeapGraphEdge::kProperty, "lazy"); | 665 GetProperty(global, v8::HeapGraphEdge::kProperty, "lazy"); |
667 CHECK_NE(NULL, lazy); | 666 CHECK_NE(NULL, lazy); |
668 CHECK_EQ(v8::HeapGraphNode::kClosure, lazy->GetType()); | 667 CHECK_EQ(v8::HeapGraphNode::kClosure, lazy->GetType()); |
669 const v8::HeapGraphNode* inferred = | |
670 GetProperty(global, v8::HeapGraphEdge::kProperty, "inferred"); | |
671 CHECK_NE(NULL, inferred); | |
672 CHECK_EQ(v8::HeapGraphNode::kClosure, inferred->GetType()); | |
673 v8::String::AsciiValue inferred_name(inferred->GetName()); | |
674 CHECK_EQ("inferred", *inferred_name); | |
675 const v8::HeapGraphNode* anonymous = | 668 const v8::HeapGraphNode* anonymous = |
676 GetProperty(global, v8::HeapGraphEdge::kProperty, "anonymous"); | 669 GetProperty(global, v8::HeapGraphEdge::kProperty, "anonymous"); |
677 CHECK_NE(NULL, anonymous); | 670 CHECK_NE(NULL, anonymous); |
678 CHECK_EQ(v8::HeapGraphNode::kClosure, anonymous->GetType()); | 671 CHECK_EQ(v8::HeapGraphNode::kClosure, anonymous->GetType()); |
679 v8::String::AsciiValue anonymous_name(anonymous->GetName()); | 672 v8::String::AsciiValue anonymous_name(anonymous->GetName()); |
680 CHECK_EQ("(anonymous function)", *anonymous_name); | 673 CHECK_EQ("", *anonymous_name); |
681 | 674 |
682 // Find references to code. | 675 // Find references to code. |
683 const v8::HeapGraphNode* compiled_code = | 676 const v8::HeapGraphNode* compiled_code = |
684 GetProperty(compiled, v8::HeapGraphEdge::kInternal, "code"); | 677 GetProperty(compiled, v8::HeapGraphEdge::kInternal, "code"); |
685 CHECK_NE(NULL, compiled_code); | 678 CHECK_NE(NULL, compiled_code); |
686 const v8::HeapGraphNode* lazy_code = | 679 const v8::HeapGraphNode* lazy_code = |
687 GetProperty(lazy, v8::HeapGraphEdge::kInternal, "code"); | 680 GetProperty(lazy, v8::HeapGraphEdge::kInternal, "code"); |
688 CHECK_NE(NULL, lazy_code); | 681 CHECK_NE(NULL, lazy_code); |
689 | 682 |
690 // Verify that non-compiled code doesn't contain references to "x" | 683 // Verify that non-compiled code doesn't contain references to "x" |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 LocalContext env; | 1142 LocalContext env; |
1150 const v8::HeapSnapshot* snapshot = | 1143 const v8::HeapSnapshot* snapshot = |
1151 v8::HeapProfiler::TakeSnapshot(v8::String::New("abort")); | 1144 v8::HeapProfiler::TakeSnapshot(v8::String::New("abort")); |
1152 TestJSONStream stream(5); | 1145 TestJSONStream stream(5); |
1153 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); | 1146 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); |
1154 CHECK_GT(stream.size(), 0); | 1147 CHECK_GT(stream.size(), 0); |
1155 CHECK_EQ(0, stream.eos_signaled()); | 1148 CHECK_EQ(0, stream.eos_signaled()); |
1156 } | 1149 } |
1157 | 1150 |
1158 #endif // ENABLE_LOGGING_AND_PROFILING | 1151 #endif // ENABLE_LOGGING_AND_PROFILING |
OLD | NEW |