| Index: runtime/vm/profiler_test.cc
|
| diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
|
| index 8dc7aea3266fff0d381c551d5aac3f758be7f2ca..17f0fdc41ee36058bd50a75dcfd336b06bdc4650 100644
|
| --- a/runtime/vm/profiler_test.cc
|
| +++ b/runtime/vm/profiler_test.cc
|
| @@ -2809,6 +2809,112 @@ TEST_CASE(Profiler_GetSourceReport) {
|
| EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString());
|
| }
|
|
|
| +
|
| +TEST_CASE(Profiler_ProfileCodeTableTest) {
|
| + Zone* Z = Thread::Current()->zone();
|
| +
|
| + ProfileCodeTable* table = new (Z) ProfileCodeTable();
|
| + EXPECT_EQ(table->length(), 0);
|
| + EXPECT_EQ(table->FindCodeForPC(42), static_cast<ProfileCode*>(NULL));
|
| +
|
| + int64_t timestamp = 0;
|
| + Code& null_code = Code::Handle(Z);
|
| +
|
| + ProfileCode* code1 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 50, 60, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code1), 0);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(55), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(59), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(60), static_cast<ProfileCode*>(NULL));
|
| +
|
| + // Insert below all.
|
| + ProfileCode* code2 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 10, 20, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code2), 0);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(10), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(19), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(20), static_cast<ProfileCode*>(NULL));
|
| +
|
| + // Insert above all.
|
| + ProfileCode* code3 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 80, 90, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code3), 2);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(10), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(80), code3);
|
| + EXPECT_EQ(table->FindCodeForPC(89), code3);
|
| + EXPECT_EQ(table->FindCodeForPC(90), static_cast<ProfileCode*>(NULL));
|
| +
|
| + // Insert between.
|
| + ProfileCode* code4 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 65, 75, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code4), 2);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(10), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(80), code3);
|
| + EXPECT_EQ(table->FindCodeForPC(65), code4);
|
| + EXPECT_EQ(table->FindCodeForPC(74), code4);
|
| + EXPECT_EQ(table->FindCodeForPC(75), static_cast<ProfileCode*>(NULL));
|
| +
|
| + // Insert overlapping left.
|
| + ProfileCode* code5 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 15, 25, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code5), 0);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(10), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(80), code3);
|
| + EXPECT_EQ(table->FindCodeForPC(65), code4);
|
| + EXPECT_EQ(table->FindCodeForPC(15), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(24), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(25), static_cast<ProfileCode*>(NULL));
|
| +
|
| + // Insert overlapping right.
|
| + ProfileCode* code6 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 45, 55, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code6), 1);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(10), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(80), code3);
|
| + EXPECT_EQ(table->FindCodeForPC(65), code4);
|
| + EXPECT_EQ(table->FindCodeForPC(15), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(24), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(45), code1); // Merged right.
|
| + EXPECT_EQ(table->FindCodeForPC(54), code1); // Merged right.
|
| + EXPECT_EQ(table->FindCodeForPC(55), code1);
|
| +
|
| + // Insert overlapping both.
|
| + ProfileCode* code7 = new (Z)
|
| + ProfileCode(ProfileCode::kNativeCode, 20, 50, timestamp, null_code);
|
| + EXPECT_EQ(table->InsertCode(code7), 0);
|
| + EXPECT_EQ(table->FindCodeForPC(0), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(100), static_cast<ProfileCode*>(NULL));
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| + EXPECT_EQ(table->FindCodeForPC(10), code2);
|
| + EXPECT_EQ(table->FindCodeForPC(80), code3);
|
| + EXPECT_EQ(table->FindCodeForPC(65), code4);
|
| + EXPECT_EQ(table->FindCodeForPC(15), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(24), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(45), code1); // Merged right.
|
| + EXPECT_EQ(table->FindCodeForPC(54), code1); // Merged right.
|
| + EXPECT_EQ(table->FindCodeForPC(20), code2); // Merged left.
|
| + EXPECT_EQ(table->FindCodeForPC(49), code1); // Truncated.
|
| + EXPECT_EQ(table->FindCodeForPC(50), code1);
|
| +}
|
| +
|
| #endif // !PRODUCT
|
|
|
| } // namespace dart
|
|
|