Unresolved types aren't assignable from Object.
Also, don't eliminate check-cast if an access check is required.
Change-Id: Ibb864e01917a93f77db4cf6eb53461c5c7cb0162
diff --git a/src/compiler/dex/quick/gen_common.cc b/src/compiler/dex/quick/gen_common.cc
index 12bdddd..055b67c 100644
--- a/src/compiler/dex/quick/gen_common.cc
+++ b/src/compiler/dex/quick/gen_common.cc
@@ -973,8 +973,10 @@
const CompilerDriver::MethodReference mr(
cu->GetDexFile(),
cu->GetDexMethodIndex());
-
- if (cu_->compiler_driver->IsSafeCast(mr, insn_idx)) {
+ bool needs_access_check = !cu_->compiler_driver->CanAccessTypeWithoutChecks(cu_->method_idx,
+ *cu_->dex_file,
+ type_idx);
+ if (!needs_access_check && cu_->compiler_driver->IsSafeCast(mr, insn_idx)) {
// Verifier type analysis proved this check cast would never cause an exception.
return;
}
@@ -983,9 +985,7 @@
LockCallTemps();
LoadCurrMethodDirect(TargetReg(kArg1)); // kArg1 <= current Method*
int class_reg = TargetReg(kArg2); // kArg2 will hold the Class*
- if (!cu_->compiler_driver->CanAccessTypeWithoutChecks(cu_->method_idx,
- *cu_->dex_file,
- type_idx)) {
+ if (needs_access_check) {
// Check we have access to type_idx and if not throw IllegalAccessError,
// returns Class* in kRet0
// InitializeTypeAndVerifyAccess(idx, method)
diff --git a/src/verifier/method_verifier.cc b/src/verifier/method_verifier.cc
index 9d4b902..2798ab3 100644
--- a/src/verifier/method_verifier.cc
+++ b/src/verifier/method_verifier.cc
@@ -3325,7 +3325,6 @@
mscs->insert(dex_pc);
}
}
-
return mscs.release();
}
diff --git a/src/verifier/reg_type.cc b/src/verifier/reg_type.cc
index 55ebcdb..8111db6 100644
--- a/src/verifier/reg_type.cc
+++ b/src/verifier/reg_type.cc
@@ -747,8 +747,8 @@
// We're assignable from the Class point-of-view
return true;
} else if (IsUnresolvedTypes()) {
- // Unresolved types are only assignable for null, Object and equality.
- return (src.IsZero() || src.IsJavaLangObject());
+ // Unresolved types are only assignable for null and equality.
+ return src.IsZero();
} else {
return false;
}