Handle VERIFY_ERROR_INSTANTIATION in compiler and nterp.
Nterp always supported it, but the compiler was missing a check.
Test: test.py
Test: 600-verifier-fails
Change-Id: I8675ca6f61c68c4152212c81843da8248781f18a
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc
index 76ee456..3b1086e 100644
--- a/compiler/optimizing/instruction_builder.cc
+++ b/compiler/optimizing/instruction_builder.cc
@@ -1269,6 +1269,7 @@
if (load_class->NeedsAccessCheck() ||
klass == nullptr || // Finalizable/instantiable is unknown.
klass->IsFinalizable() ||
+ klass.Get() == klass->GetClass() || // Classes cannot be allocated in code
!klass->IsInstantiable()) {
entrypoint = kQuickAllocObjectWithChecks;
}
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 4bebbcc..8ab588e 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -5174,6 +5174,7 @@
static inline bool CanRuntimeHandleVerificationFailure(uint32_t encountered_failure_types) {
constexpr uint32_t unresolved_mask =
verifier::VerifyError::VERIFY_ERROR_CLASS_CHANGE |
+ verifier::VerifyError::VERIFY_ERROR_INSTANTIATION |
verifier::VerifyError::VERIFY_ERROR_ACCESS_CLASS |
verifier::VerifyError::VERIFY_ERROR_ACCESS_FIELD |
verifier::VerifyError::VERIFY_ERROR_NO_METHOD |
diff --git a/runtime/verifier/verifier_compiler_binding.h b/runtime/verifier/verifier_compiler_binding.h
index a92a063..1fa02f8 100644
--- a/runtime/verifier/verifier_compiler_binding.h
+++ b/runtime/verifier/verifier_compiler_binding.h
@@ -30,6 +30,7 @@
constexpr uint32_t unresolved_mask = verifier::VerifyError::VERIFY_ERROR_NO_CLASS
| verifier::VerifyError::VERIFY_ERROR_CLASS_CHANGE
| verifier::VerifyError::VERIFY_ERROR_NO_METHOD
+ | verifier::VerifyError::VERIFY_ERROR_INSTANTIATION
| verifier::VerifyError::VERIFY_ERROR_ACCESS_CLASS
| verifier::VerifyError::VERIFY_ERROR_ACCESS_FIELD
| verifier::VerifyError::VERIFY_ERROR_ACCESS_METHOD;