| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 using i::CpuProfiler; | 44 using i::CpuProfiler; |
| 45 using i::CpuProfilesCollection; | 45 using i::CpuProfilesCollection; |
| 46 using i::ProfileNode; | 46 using i::ProfileNode; |
| 47 using i::ProfileTree; | 47 using i::ProfileTree; |
| 48 using i::ProfileGenerator; | 48 using i::ProfileGenerator; |
| 49 using i::TickSample; | 49 using i::TickSample; |
| 50 using i::Vector; | 50 using i::Vector; |
| 51 | 51 |
| 52 | 52 |
| 53 TEST(ProfileNodeFindOrAddChild) { | 53 TEST(ProfileNodeFindOrAddChild) { |
| 54 ProfileTree tree; | 54 CcTest::InitializeVM(); |
| 55 ProfileTree tree(CcTest::i_isolate()); |
| 55 ProfileNode* node = tree.root(); | 56 ProfileNode* node = tree.root(); |
| 56 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); | 57 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); |
| 57 ProfileNode* childNode1 = node->FindOrAddChild(&entry1); | 58 ProfileNode* childNode1 = node->FindOrAddChild(&entry1); |
| 58 CHECK(childNode1); | 59 CHECK(childNode1); |
| 59 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); | 60 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); |
| 60 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); | 61 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); |
| 61 ProfileNode* childNode2 = node->FindOrAddChild(&entry2); | 62 ProfileNode* childNode2 = node->FindOrAddChild(&entry2); |
| 62 CHECK(childNode2); | 63 CHECK(childNode2); |
| 63 CHECK_NE(childNode1, childNode2); | 64 CHECK_NE(childNode1, childNode2); |
| 64 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); | 65 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); |
| 65 CHECK_EQ(childNode2, node->FindOrAddChild(&entry2)); | 66 CHECK_EQ(childNode2, node->FindOrAddChild(&entry2)); |
| 66 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); | 67 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); |
| 67 ProfileNode* childNode3 = node->FindOrAddChild(&entry3); | 68 ProfileNode* childNode3 = node->FindOrAddChild(&entry3); |
| 68 CHECK(childNode3); | 69 CHECK(childNode3); |
| 69 CHECK_NE(childNode1, childNode3); | 70 CHECK_NE(childNode1, childNode3); |
| 70 CHECK_NE(childNode2, childNode3); | 71 CHECK_NE(childNode2, childNode3); |
| 71 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); | 72 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); |
| 72 CHECK_EQ(childNode2, node->FindOrAddChild(&entry2)); | 73 CHECK_EQ(childNode2, node->FindOrAddChild(&entry2)); |
| 73 CHECK_EQ(childNode3, node->FindOrAddChild(&entry3)); | 74 CHECK_EQ(childNode3, node->FindOrAddChild(&entry3)); |
| 74 } | 75 } |
| 75 | 76 |
| 76 | 77 |
| 77 TEST(ProfileNodeFindOrAddChildForSameFunction) { | 78 TEST(ProfileNodeFindOrAddChildForSameFunction) { |
| 79 CcTest::InitializeVM(); |
| 78 const char* aaa = "aaa"; | 80 const char* aaa = "aaa"; |
| 79 ProfileTree tree; | 81 ProfileTree tree(CcTest::i_isolate()); |
| 80 ProfileNode* node = tree.root(); | 82 ProfileNode* node = tree.root(); |
| 81 CodeEntry entry1(i::Logger::FUNCTION_TAG, aaa); | 83 CodeEntry entry1(i::Logger::FUNCTION_TAG, aaa); |
| 82 ProfileNode* childNode1 = node->FindOrAddChild(&entry1); | 84 ProfileNode* childNode1 = node->FindOrAddChild(&entry1); |
| 83 CHECK(childNode1); | 85 CHECK(childNode1); |
| 84 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); | 86 CHECK_EQ(childNode1, node->FindOrAddChild(&entry1)); |
| 85 // The same function again. | 87 // The same function again. |
| 86 CodeEntry entry2(i::Logger::FUNCTION_TAG, aaa); | 88 CodeEntry entry2(i::Logger::FUNCTION_TAG, aaa); |
| 87 CHECK_EQ(childNode1, node->FindOrAddChild(&entry2)); | 89 CHECK_EQ(childNode1, node->FindOrAddChild(&entry2)); |
| 88 // Now with a different security token. | 90 // Now with a different security token. |
| 89 CodeEntry entry3(i::Logger::FUNCTION_TAG, aaa); | 91 CodeEntry entry3(i::Logger::FUNCTION_TAG, aaa); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 115 } | 117 } |
| 116 | 118 |
| 117 private: | 119 private: |
| 118 const ProfileTree* tree_; | 120 const ProfileTree* tree_; |
| 119 }; | 121 }; |
| 120 | 122 |
| 121 } // namespace | 123 } // namespace |
| 122 | 124 |
| 123 | 125 |
| 124 TEST(ProfileTreeAddPathFromEnd) { | 126 TEST(ProfileTreeAddPathFromEnd) { |
| 127 CcTest::InitializeVM(); |
| 125 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); | 128 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); |
| 126 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); | 129 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); |
| 127 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); | 130 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); |
| 128 ProfileTree tree; | 131 ProfileTree tree(CcTest::i_isolate()); |
| 129 ProfileTreeTestHelper helper(&tree); | 132 ProfileTreeTestHelper helper(&tree); |
| 130 CHECK(!helper.Walk(&entry1)); | 133 CHECK(!helper.Walk(&entry1)); |
| 131 CHECK(!helper.Walk(&entry2)); | 134 CHECK(!helper.Walk(&entry2)); |
| 132 CHECK(!helper.Walk(&entry3)); | 135 CHECK(!helper.Walk(&entry3)); |
| 133 | 136 |
| 134 CodeEntry* path[] = {NULL, &entry3, NULL, &entry2, NULL, NULL, &entry1, NULL}; | 137 CodeEntry* path[] = {NULL, &entry3, NULL, &entry2, NULL, NULL, &entry1, NULL}; |
| 135 Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0])); | 138 Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0])); |
| 136 tree.AddPathFromEnd(path_vec); | 139 tree.AddPathFromEnd(path_vec); |
| 137 CHECK(!helper.Walk(&entry2)); | 140 CHECK(!helper.Walk(&entry2)); |
| 138 CHECK(!helper.Walk(&entry3)); | 141 CHECK(!helper.Walk(&entry3)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3)); | 177 CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3)); |
| 175 CHECK_EQ(2u, node3->self_ticks()); | 178 CHECK_EQ(2u, node3->self_ticks()); |
| 176 ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2); | 179 ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2); |
| 177 CHECK(node4); | 180 CHECK(node4); |
| 178 CHECK_NE(node3, node4); | 181 CHECK_NE(node3, node4); |
| 179 CHECK_EQ(1u, node4->self_ticks()); | 182 CHECK_EQ(1u, node4->self_ticks()); |
| 180 } | 183 } |
| 181 | 184 |
| 182 | 185 |
| 183 TEST(ProfileTreeCalculateTotalTicks) { | 186 TEST(ProfileTreeCalculateTotalTicks) { |
| 184 ProfileTree empty_tree; | 187 CcTest::InitializeVM(); |
| 188 ProfileTree empty_tree(CcTest::i_isolate()); |
| 185 CHECK_EQ(0u, empty_tree.root()->self_ticks()); | 189 CHECK_EQ(0u, empty_tree.root()->self_ticks()); |
| 186 empty_tree.root()->IncrementSelfTicks(); | 190 empty_tree.root()->IncrementSelfTicks(); |
| 187 CHECK_EQ(1u, empty_tree.root()->self_ticks()); | 191 CHECK_EQ(1u, empty_tree.root()->self_ticks()); |
| 188 | 192 |
| 189 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); | 193 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); |
| 190 CodeEntry* e1_path[] = {&entry1}; | 194 CodeEntry* e1_path[] = {&entry1}; |
| 191 Vector<CodeEntry*> e1_path_vec( | 195 Vector<CodeEntry*> e1_path_vec( |
| 192 e1_path, sizeof(e1_path) / sizeof(e1_path[0])); | 196 e1_path, sizeof(e1_path) / sizeof(e1_path[0])); |
| 193 | 197 |
| 194 ProfileTree single_child_tree; | 198 ProfileTree single_child_tree(CcTest::i_isolate()); |
| 195 single_child_tree.AddPathFromEnd(e1_path_vec); | 199 single_child_tree.AddPathFromEnd(e1_path_vec); |
| 196 single_child_tree.root()->IncrementSelfTicks(); | 200 single_child_tree.root()->IncrementSelfTicks(); |
| 197 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); | 201 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); |
| 198 ProfileTreeTestHelper single_child_helper(&single_child_tree); | 202 ProfileTreeTestHelper single_child_helper(&single_child_tree); |
| 199 ProfileNode* node1 = single_child_helper.Walk(&entry1); | 203 ProfileNode* node1 = single_child_helper.Walk(&entry1); |
| 200 CHECK(node1); | 204 CHECK(node1); |
| 201 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); | 205 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); |
| 202 CHECK_EQ(1u, node1->self_ticks()); | 206 CHECK_EQ(1u, node1->self_ticks()); |
| 203 | 207 |
| 204 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); | 208 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); |
| 205 CodeEntry* e2_e1_path[] = {&entry2, &entry1}; | 209 CodeEntry* e2_e1_path[] = {&entry2, &entry1}; |
| 206 Vector<CodeEntry*> e2_e1_path_vec(e2_e1_path, | 210 Vector<CodeEntry*> e2_e1_path_vec(e2_e1_path, |
| 207 sizeof(e2_e1_path) / sizeof(e2_e1_path[0])); | 211 sizeof(e2_e1_path) / sizeof(e2_e1_path[0])); |
| 208 | 212 |
| 209 ProfileTree flat_tree; | 213 ProfileTree flat_tree(CcTest::i_isolate()); |
| 210 ProfileTreeTestHelper flat_helper(&flat_tree); | 214 ProfileTreeTestHelper flat_helper(&flat_tree); |
| 211 flat_tree.AddPathFromEnd(e1_path_vec); | 215 flat_tree.AddPathFromEnd(e1_path_vec); |
| 212 flat_tree.AddPathFromEnd(e1_path_vec); | 216 flat_tree.AddPathFromEnd(e1_path_vec); |
| 213 flat_tree.AddPathFromEnd(e2_e1_path_vec); | 217 flat_tree.AddPathFromEnd(e2_e1_path_vec); |
| 214 flat_tree.AddPathFromEnd(e2_e1_path_vec); | 218 flat_tree.AddPathFromEnd(e2_e1_path_vec); |
| 215 flat_tree.AddPathFromEnd(e2_e1_path_vec); | 219 flat_tree.AddPathFromEnd(e2_e1_path_vec); |
| 216 // Results in {root,0,0} -> {entry1,0,2} -> {entry2,0,3} | 220 // Results in {root,0,0} -> {entry1,0,2} -> {entry2,0,3} |
| 217 CHECK_EQ(0u, flat_tree.root()->self_ticks()); | 221 CHECK_EQ(0u, flat_tree.root()->self_ticks()); |
| 218 node1 = flat_helper.Walk(&entry1); | 222 node1 = flat_helper.Walk(&entry1); |
| 219 CHECK(node1); | 223 CHECK(node1); |
| 220 CHECK_EQ(2u, node1->self_ticks()); | 224 CHECK_EQ(2u, node1->self_ticks()); |
| 221 ProfileNode* node2 = flat_helper.Walk(&entry1, &entry2); | 225 ProfileNode* node2 = flat_helper.Walk(&entry1, &entry2); |
| 222 CHECK(node2); | 226 CHECK(node2); |
| 223 CHECK_EQ(3u, node2->self_ticks()); | 227 CHECK_EQ(3u, node2->self_ticks()); |
| 224 // Must calculate {root,5,0} -> {entry1,5,2} -> {entry2,3,3} | 228 // Must calculate {root,5,0} -> {entry1,5,2} -> {entry2,3,3} |
| 225 CHECK_EQ(0u, flat_tree.root()->self_ticks()); | 229 CHECK_EQ(0u, flat_tree.root()->self_ticks()); |
| 226 CHECK_EQ(2u, node1->self_ticks()); | 230 CHECK_EQ(2u, node1->self_ticks()); |
| 227 | 231 |
| 228 CodeEntry* e2_path[] = {&entry2}; | 232 CodeEntry* e2_path[] = {&entry2}; |
| 229 Vector<CodeEntry*> e2_path_vec( | 233 Vector<CodeEntry*> e2_path_vec( |
| 230 e2_path, sizeof(e2_path) / sizeof(e2_path[0])); | 234 e2_path, sizeof(e2_path) / sizeof(e2_path[0])); |
| 231 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); | 235 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); |
| 232 CodeEntry* e3_path[] = {&entry3}; | 236 CodeEntry* e3_path[] = {&entry3}; |
| 233 Vector<CodeEntry*> e3_path_vec( | 237 Vector<CodeEntry*> e3_path_vec( |
| 234 e3_path, sizeof(e3_path) / sizeof(e3_path[0])); | 238 e3_path, sizeof(e3_path) / sizeof(e3_path[0])); |
| 235 | 239 |
| 236 ProfileTree wide_tree; | 240 ProfileTree wide_tree(CcTest::i_isolate()); |
| 237 ProfileTreeTestHelper wide_helper(&wide_tree); | 241 ProfileTreeTestHelper wide_helper(&wide_tree); |
| 238 wide_tree.AddPathFromEnd(e1_path_vec); | 242 wide_tree.AddPathFromEnd(e1_path_vec); |
| 239 wide_tree.AddPathFromEnd(e1_path_vec); | 243 wide_tree.AddPathFromEnd(e1_path_vec); |
| 240 wide_tree.AddPathFromEnd(e2_e1_path_vec); | 244 wide_tree.AddPathFromEnd(e2_e1_path_vec); |
| 241 wide_tree.AddPathFromEnd(e2_path_vec); | 245 wide_tree.AddPathFromEnd(e2_path_vec); |
| 242 wide_tree.AddPathFromEnd(e2_path_vec); | 246 wide_tree.AddPathFromEnd(e2_path_vec); |
| 243 wide_tree.AddPathFromEnd(e2_path_vec); | 247 wide_tree.AddPathFromEnd(e2_path_vec); |
| 244 wide_tree.AddPathFromEnd(e3_path_vec); | 248 wide_tree.AddPathFromEnd(e3_path_vec); |
| 245 wide_tree.AddPathFromEnd(e3_path_vec); | 249 wide_tree.AddPathFromEnd(e3_path_vec); |
| 246 wide_tree.AddPathFromEnd(e3_path_vec); | 250 wide_tree.AddPathFromEnd(e3_path_vec); |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 CHECK(const_cast<v8::CpuProfileNode*>(current)); | 721 CHECK(const_cast<v8::CpuProfileNode*>(current)); |
| 718 | 722 |
| 719 current = PickChild(current, "TryFinally"); | 723 current = PickChild(current, "TryFinally"); |
| 720 CHECK(const_cast<v8::CpuProfileNode*>(current)); | 724 CHECK(const_cast<v8::CpuProfileNode*>(current)); |
| 721 CHECK(!strcmp("TryFinallyStatement", current->GetBailoutReason())); | 725 CHECK(!strcmp("TryFinallyStatement", current->GetBailoutReason())); |
| 722 | 726 |
| 723 current = PickChild(current, "Debugger"); | 727 current = PickChild(current, "Debugger"); |
| 724 CHECK(const_cast<v8::CpuProfileNode*>(current)); | 728 CHECK(const_cast<v8::CpuProfileNode*>(current)); |
| 725 CHECK(!strcmp("DebuggerStatement", current->GetBailoutReason())); | 729 CHECK(!strcmp("DebuggerStatement", current->GetBailoutReason())); |
| 726 } | 730 } |
| OLD | NEW |