diff options
| author | 2017-07-18 00:12:13 +0000 | |
|---|---|---|
| committer | 2017-07-18 00:12:13 +0000 | |
| commit | d317295ed07384c69d5890d6b17b80d57139a082 (patch) | |
| tree | 7ef48ea60165f89c852bf957207c65c155d49026 /compiler/driver/compiler_driver.cc | |
| parent | 71a8e5b25f0be5ab5bf0e1c73a9e5aabc3a23488 (diff) | |
| parent | 0cb172874481f736c6b7c491dd621166cc25561b (diff) | |
Merge "Do superclass validation at compile time and log with new class status."
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
| -rw-r--r-- | compiler/driver/compiler_driver.cc | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index c04e45d334..ff92ac43b8 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -2246,7 +2246,7 @@ class InitializeClassVisitor : public CompilationVisitor { const bool is_boot_image = manager_->GetCompiler()->GetCompilerOptions().IsBootImage(); const bool is_app_image = manager_->GetCompiler()->GetCompilerOptions().IsAppImage(); - mirror::Class::Status old_status = klass->GetStatus();; + mirror::Class::Status old_status = klass->GetStatus(); // Only try to initialize classes that were successfully verified. if (klass->IsVerified()) { // Don't initialize classes in boot space when compiling app image @@ -2364,6 +2364,14 @@ class InitializeClassVisitor : public CompilationVisitor { } } } + // If the class still isn't initialized, at least try some checks that initialization + // would do so they can be skipped at runtime. + if (!klass->IsInitialized() && + manager_->GetClassLinker()->ValidateSuperClassDescriptors(klass)) { + old_status = mirror::Class::kStatusSuperclassValidated; + } else { + soa.Self()->ClearException(); + } soa.Self()->AssertNoPendingException(); } } @@ -2861,13 +2869,14 @@ bool CompilerDriver::GetCompiledClass(ClassReference ref, mirror::Class::Status* void CompilerDriver::RecordClassStatus(ClassReference ref, mirror::Class::Status status) { switch (status) { - case mirror::Class::kStatusNotReady: case mirror::Class::kStatusErrorResolved: case mirror::Class::kStatusErrorUnresolved: + case mirror::Class::kStatusNotReady: + case mirror::Class::kStatusResolved: case mirror::Class::kStatusRetryVerificationAtRuntime: case mirror::Class::kStatusVerified: + case mirror::Class::kStatusSuperclassValidated: case mirror::Class::kStatusInitialized: - case mirror::Class::kStatusResolved: break; // Expected states. default: LOG(FATAL) << "Unexpected class status for class " |