From f1aa26599d866abe3c31ac959b042fc32d7fb581 Mon Sep 17 00:00:00 2001 From: Jeff Hao Date: Thu, 3 Aug 2017 17:09:33 -0700 Subject: Fix issue where classes that fail verification have kStatusNotReady. Classes that failed verification at compile time were not getting the status kStatusRetryVerificationAtRuntime. This is because GetCompiledClass would return false for anything that wasn't verified, making it look like the compiler had not touched the class at all, when it should have failed verification. Test: mm test-art-host Bug: 64392002 Change-Id: I9687bcb53c60c1fb0a2df2f642ce9102cb488822 --- compiler/driver/compiler_driver_test.cc | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'compiler/driver/compiler_driver_test.cc') diff --git a/compiler/driver/compiler_driver_test.cc b/compiler/driver/compiler_driver_test.cc index fee6afb91f..4da3e0df39 100644 --- a/compiler/driver/compiler_driver_test.cc +++ b/compiler/driver/compiler_driver_test.cc @@ -366,6 +366,40 @@ TEST_F(CompilerDriverVerifyTest, VerifyCompilation) { CheckVerifiedClass(class_loader, "LSecond;"); } +// Test that a class of status kStatusRetryVerificationAtRuntime is indeed recorded that way in the +// driver. +TEST_F(CompilerDriverVerifyTest, RetryVerifcationStatus) { + Thread* const self = Thread::Current(); + jobject class_loader; + std::vector dex_files; + const DexFile* dex_file = nullptr; + { + ScopedObjectAccess soa(self); + class_loader = LoadDex("ProfileTestMultiDex"); + ASSERT_NE(class_loader, nullptr); + dex_files = GetDexFiles(class_loader); + ASSERT_GT(dex_files.size(), 0u); + dex_file = dex_files.front(); + } + compiler_driver_->SetDexFilesForOatFile(dex_files); + ClassReference ref(dex_file, 0u); + // Test that the status is read from the compiler driver as expected. + for (size_t i = mirror::Class::kStatusRetryVerificationAtRuntime; + i < mirror::Class::kStatusMax; + ++i) { + const mirror::Class::Status expected_status = static_cast(i); + // Skip unsupported status that are not supposed to be ever recorded. + if (expected_status == mirror::Class::kStatusVerifyingAtRuntime || + expected_status == mirror::Class::kStatusInitializing) { + continue; + } + compiler_driver_->RecordClassStatus(ref, expected_status); + mirror::Class::Status status = {}; + ASSERT_TRUE(compiler_driver_->GetCompiledClass(ref, &status)); + EXPECT_EQ(status, expected_status); + } +} + // TODO: need check-cast test (when stub complete & we can throw/catch } // namespace art -- cgit v1.2.3-59-g8ed1b