| 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 } | 110 } |
| 111 return node; | 111 return node; |
| 112 } | 112 } |
| 113 | 113 |
| 114 private: | 114 private: |
| 115 const ProfileTree* tree_; | 115 const ProfileTree* tree_; |
| 116 }; | 116 }; |
| 117 | 117 |
| 118 } // namespace | 118 } // namespace |
| 119 | 119 |
| 120 TEST(ProfileTreeAddPathFromStart) { | |
| 121 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); | |
| 122 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); | |
| 123 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); | |
| 124 ProfileTree tree; | |
| 125 ProfileTreeTestHelper helper(&tree); | |
| 126 CHECK(!helper.Walk(&entry1)); | |
| 127 CHECK(!helper.Walk(&entry2)); | |
| 128 CHECK(!helper.Walk(&entry3)); | |
| 129 | |
| 130 CodeEntry* path[] = {NULL, &entry1, NULL, &entry2, NULL, NULL, &entry3, NULL}; | |
| 131 Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0])); | |
| 132 tree.AddPathFromStart(path_vec); | |
| 133 CHECK(!helper.Walk(&entry2)); | |
| 134 CHECK(!helper.Walk(&entry3)); | |
| 135 ProfileNode* node1 = helper.Walk(&entry1); | |
| 136 CHECK(node1); | |
| 137 CHECK_EQ(0u, node1->self_ticks()); | |
| 138 CHECK(!helper.Walk(&entry1, &entry1)); | |
| 139 CHECK(!helper.Walk(&entry1, &entry3)); | |
| 140 ProfileNode* node2 = helper.Walk(&entry1, &entry2); | |
| 141 CHECK(node2); | |
| 142 CHECK_NE(node1, node2); | |
| 143 CHECK_EQ(0u, node2->self_ticks()); | |
| 144 CHECK(!helper.Walk(&entry1, &entry2, &entry1)); | |
| 145 CHECK(!helper.Walk(&entry1, &entry2, &entry2)); | |
| 146 ProfileNode* node3 = helper.Walk(&entry1, &entry2, &entry3); | |
| 147 CHECK(node3); | |
| 148 CHECK_NE(node1, node3); | |
| 149 CHECK_NE(node2, node3); | |
| 150 CHECK_EQ(1u, node3->self_ticks()); | |
| 151 | |
| 152 tree.AddPathFromStart(path_vec); | |
| 153 CHECK_EQ(node1, helper.Walk(&entry1)); | |
| 154 CHECK_EQ(node2, helper.Walk(&entry1, &entry2)); | |
| 155 CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3)); | |
| 156 CHECK_EQ(0u, node1->self_ticks()); | |
| 157 CHECK_EQ(0u, node2->self_ticks()); | |
| 158 CHECK_EQ(2u, node3->self_ticks()); | |
| 159 | |
| 160 CodeEntry* path2[] = {&entry1, &entry2, &entry2}; | |
| 161 Vector<CodeEntry*> path2_vec(path2, sizeof(path2) / sizeof(path2[0])); | |
| 162 tree.AddPathFromStart(path2_vec); | |
| 163 CHECK(!helper.Walk(&entry2)); | |
| 164 CHECK(!helper.Walk(&entry3)); | |
| 165 CHECK_EQ(node1, helper.Walk(&entry1)); | |
| 166 CHECK(!helper.Walk(&entry1, &entry1)); | |
| 167 CHECK(!helper.Walk(&entry1, &entry3)); | |
| 168 CHECK_EQ(node2, helper.Walk(&entry1, &entry2)); | |
| 169 CHECK(!helper.Walk(&entry1, &entry2, &entry1)); | |
| 170 CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3)); | |
| 171 CHECK_EQ(2u, node3->self_ticks()); | |
| 172 ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2); | |
| 173 CHECK(node4); | |
| 174 CHECK_NE(node3, node4); | |
| 175 CHECK_EQ(1u, node4->self_ticks()); | |
| 176 } | |
| 177 | |
| 178 | 120 |
| 179 TEST(ProfileTreeAddPathFromEnd) { | 121 TEST(ProfileTreeAddPathFromEnd) { |
| 180 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); | 122 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); |
| 181 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); | 123 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); |
| 182 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); | 124 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); |
| 183 ProfileTree tree; | 125 ProfileTree tree; |
| 184 ProfileTreeTestHelper helper(&tree); | 126 ProfileTreeTestHelper helper(&tree); |
| 185 CHECK(!helper.Walk(&entry1)); | 127 CHECK(!helper.Walk(&entry1)); |
| 186 CHECK(!helper.Walk(&entry2)); | 128 CHECK(!helper.Walk(&entry2)); |
| 187 CHECK(!helper.Walk(&entry3)); | 129 CHECK(!helper.Walk(&entry3)); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 CHECK_EQ(0u, empty_tree.root()->self_ticks()); | 182 CHECK_EQ(0u, empty_tree.root()->self_ticks()); |
| 241 empty_tree.root()->IncrementSelfTicks(); | 183 empty_tree.root()->IncrementSelfTicks(); |
| 242 CHECK_EQ(1u, empty_tree.root()->self_ticks()); | 184 CHECK_EQ(1u, empty_tree.root()->self_ticks()); |
| 243 | 185 |
| 244 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); | 186 CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa"); |
| 245 CodeEntry* e1_path[] = {&entry1}; | 187 CodeEntry* e1_path[] = {&entry1}; |
| 246 Vector<CodeEntry*> e1_path_vec( | 188 Vector<CodeEntry*> e1_path_vec( |
| 247 e1_path, sizeof(e1_path) / sizeof(e1_path[0])); | 189 e1_path, sizeof(e1_path) / sizeof(e1_path[0])); |
| 248 | 190 |
| 249 ProfileTree single_child_tree; | 191 ProfileTree single_child_tree; |
| 250 single_child_tree.AddPathFromStart(e1_path_vec); | 192 single_child_tree.AddPathFromEnd(e1_path_vec); |
| 251 single_child_tree.root()->IncrementSelfTicks(); | 193 single_child_tree.root()->IncrementSelfTicks(); |
| 252 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); | 194 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); |
| 253 ProfileTreeTestHelper single_child_helper(&single_child_tree); | 195 ProfileTreeTestHelper single_child_helper(&single_child_tree); |
| 254 ProfileNode* node1 = single_child_helper.Walk(&entry1); | 196 ProfileNode* node1 = single_child_helper.Walk(&entry1); |
| 255 CHECK(node1); | 197 CHECK(node1); |
| 256 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); | 198 CHECK_EQ(1u, single_child_tree.root()->self_ticks()); |
| 257 CHECK_EQ(1u, node1->self_ticks()); | 199 CHECK_EQ(1u, node1->self_ticks()); |
| 258 | 200 |
| 259 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); | 201 CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb"); |
| 260 CodeEntry* e1_e2_path[] = {&entry1, &entry2}; | 202 CodeEntry* e2_e1_path[] = {&entry2, &entry1}; |
| 261 Vector<CodeEntry*> e1_e2_path_vec( | 203 Vector<CodeEntry*> e2_e1_path_vec(e2_e1_path, |
| 262 e1_e2_path, sizeof(e1_e2_path) / sizeof(e1_e2_path[0])); | 204 sizeof(e2_e1_path) / sizeof(e2_e1_path[0])); |
| 263 | 205 |
| 264 ProfileTree flat_tree; | 206 ProfileTree flat_tree; |
| 265 ProfileTreeTestHelper flat_helper(&flat_tree); | 207 ProfileTreeTestHelper flat_helper(&flat_tree); |
| 266 flat_tree.AddPathFromStart(e1_path_vec); | 208 flat_tree.AddPathFromEnd(e1_path_vec); |
| 267 flat_tree.AddPathFromStart(e1_path_vec); | 209 flat_tree.AddPathFromEnd(e1_path_vec); |
| 268 flat_tree.AddPathFromStart(e1_e2_path_vec); | 210 flat_tree.AddPathFromEnd(e2_e1_path_vec); |
| 269 flat_tree.AddPathFromStart(e1_e2_path_vec); | 211 flat_tree.AddPathFromEnd(e2_e1_path_vec); |
| 270 flat_tree.AddPathFromStart(e1_e2_path_vec); | 212 flat_tree.AddPathFromEnd(e2_e1_path_vec); |
| 271 // Results in {root,0,0} -> {entry1,0,2} -> {entry2,0,3} | 213 // Results in {root,0,0} -> {entry1,0,2} -> {entry2,0,3} |
| 272 CHECK_EQ(0u, flat_tree.root()->self_ticks()); | 214 CHECK_EQ(0u, flat_tree.root()->self_ticks()); |
| 273 node1 = flat_helper.Walk(&entry1); | 215 node1 = flat_helper.Walk(&entry1); |
| 274 CHECK(node1); | 216 CHECK(node1); |
| 275 CHECK_EQ(2u, node1->self_ticks()); | 217 CHECK_EQ(2u, node1->self_ticks()); |
| 276 ProfileNode* node2 = flat_helper.Walk(&entry1, &entry2); | 218 ProfileNode* node2 = flat_helper.Walk(&entry1, &entry2); |
| 277 CHECK(node2); | 219 CHECK(node2); |
| 278 CHECK_EQ(3u, node2->self_ticks()); | 220 CHECK_EQ(3u, node2->self_ticks()); |
| 279 // Must calculate {root,5,0} -> {entry1,5,2} -> {entry2,3,3} | 221 // Must calculate {root,5,0} -> {entry1,5,2} -> {entry2,3,3} |
| 280 CHECK_EQ(0u, flat_tree.root()->self_ticks()); | 222 CHECK_EQ(0u, flat_tree.root()->self_ticks()); |
| 281 CHECK_EQ(2u, node1->self_ticks()); | 223 CHECK_EQ(2u, node1->self_ticks()); |
| 282 | 224 |
| 283 CodeEntry* e2_path[] = {&entry2}; | 225 CodeEntry* e2_path[] = {&entry2}; |
| 284 Vector<CodeEntry*> e2_path_vec( | 226 Vector<CodeEntry*> e2_path_vec( |
| 285 e2_path, sizeof(e2_path) / sizeof(e2_path[0])); | 227 e2_path, sizeof(e2_path) / sizeof(e2_path[0])); |
| 286 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); | 228 CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc"); |
| 287 CodeEntry* e3_path[] = {&entry3}; | 229 CodeEntry* e3_path[] = {&entry3}; |
| 288 Vector<CodeEntry*> e3_path_vec( | 230 Vector<CodeEntry*> e3_path_vec( |
| 289 e3_path, sizeof(e3_path) / sizeof(e3_path[0])); | 231 e3_path, sizeof(e3_path) / sizeof(e3_path[0])); |
| 290 | 232 |
| 291 ProfileTree wide_tree; | 233 ProfileTree wide_tree; |
| 292 ProfileTreeTestHelper wide_helper(&wide_tree); | 234 ProfileTreeTestHelper wide_helper(&wide_tree); |
| 293 wide_tree.AddPathFromStart(e1_path_vec); | 235 wide_tree.AddPathFromEnd(e1_path_vec); |
| 294 wide_tree.AddPathFromStart(e1_path_vec); | 236 wide_tree.AddPathFromEnd(e1_path_vec); |
| 295 wide_tree.AddPathFromStart(e1_e2_path_vec); | 237 wide_tree.AddPathFromEnd(e2_e1_path_vec); |
| 296 wide_tree.AddPathFromStart(e2_path_vec); | 238 wide_tree.AddPathFromEnd(e2_path_vec); |
| 297 wide_tree.AddPathFromStart(e2_path_vec); | 239 wide_tree.AddPathFromEnd(e2_path_vec); |
| 298 wide_tree.AddPathFromStart(e2_path_vec); | 240 wide_tree.AddPathFromEnd(e2_path_vec); |
| 299 wide_tree.AddPathFromStart(e3_path_vec); | 241 wide_tree.AddPathFromEnd(e3_path_vec); |
| 300 wide_tree.AddPathFromStart(e3_path_vec); | 242 wide_tree.AddPathFromEnd(e3_path_vec); |
| 301 wide_tree.AddPathFromStart(e3_path_vec); | 243 wide_tree.AddPathFromEnd(e3_path_vec); |
| 302 wide_tree.AddPathFromStart(e3_path_vec); | 244 wide_tree.AddPathFromEnd(e3_path_vec); |
| 303 // Results in -> {entry1,0,2} -> {entry2,0,1} | 245 // Results in -> {entry1,0,2} -> {entry2,0,1} |
| 304 // {root,0,0} -> {entry2,0,3} | 246 // {root,0,0} -> {entry2,0,3} |
| 305 // -> {entry3,0,4} | 247 // -> {entry3,0,4} |
| 306 CHECK_EQ(0u, wide_tree.root()->self_ticks()); | 248 CHECK_EQ(0u, wide_tree.root()->self_ticks()); |
| 307 node1 = wide_helper.Walk(&entry1); | 249 node1 = wide_helper.Walk(&entry1); |
| 308 CHECK(node1); | 250 CHECK(node1); |
| 309 CHECK_EQ(2u, node1->self_ticks()); | 251 CHECK_EQ(2u, node1->self_ticks()); |
| 310 ProfileNode* node1_2 = wide_helper.Walk(&entry1, &entry2); | 252 ProfileNode* node1_2 = wide_helper.Walk(&entry1, &entry2); |
| 311 CHECK(node1_2); | 253 CHECK(node1_2); |
| 312 CHECK_EQ(1u, node1_2->self_ticks()); | 254 CHECK_EQ(1u, node1_2->self_ticks()); |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 CHECK(const_cast<v8::CpuProfileNode*>(current)); | 709 CHECK(const_cast<v8::CpuProfileNode*>(current)); |
| 768 | 710 |
| 769 current = PickChild(current, "TryFinally"); | 711 current = PickChild(current, "TryFinally"); |
| 770 CHECK(const_cast<v8::CpuProfileNode*>(current)); | 712 CHECK(const_cast<v8::CpuProfileNode*>(current)); |
| 771 CHECK(!strcmp("TryFinallyStatement", current->GetBailoutReason())); | 713 CHECK(!strcmp("TryFinallyStatement", current->GetBailoutReason())); |
| 772 | 714 |
| 773 current = PickChild(current, "TryCatch"); | 715 current = PickChild(current, "TryCatch"); |
| 774 CHECK(const_cast<v8::CpuProfileNode*>(current)); | 716 CHECK(const_cast<v8::CpuProfileNode*>(current)); |
| 775 CHECK(!strcmp("TryCatchStatement", current->GetBailoutReason())); | 717 CHECK(!strcmp("TryCatchStatement", current->GetBailoutReason())); |
| 776 } | 718 } |
| OLD | NEW |