summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/verifier_deps_test.cc10
-rw-r--r--runtime/verifier/verifier_deps.cc20
2 files changed, 20 insertions, 10 deletions
diff --git a/compiler/verifier_deps_test.cc b/compiler/verifier_deps_test.cc
index 85ae61f1bd..e716cdbed8 100644
--- a/compiler/verifier_deps_test.cc
+++ b/compiler/verifier_deps_test.cc
@@ -1101,6 +1101,16 @@ TEST_F(VerifierDepsTest, InvokeSuper_ThisNotAssignable) {
"virtual", "Ljava/lang/Integer;", "intValue", "()I", true, "public", "Ljava/lang/Integer;"));
}
+TEST_F(VerifierDepsTest, ArgumentType_ResolvedReferenceArray) {
+ ASSERT_TRUE(VerifyMethod("ArgumentType_ResolvedReferenceArray"));
+ ASSERT_TRUE(HasClass("[Ljava/lang/Thread;", true, "public final abstract"));
+}
+
+TEST_F(VerifierDepsTest, NewArray_Resolved) {
+ ASSERT_TRUE(VerifyMethod("NewArray_Resolved"));
+ ASSERT_TRUE(HasClass("[Ljava/lang/IllegalStateException;", true, "public final abstract"));
+}
+
TEST_F(VerifierDepsTest, EncodeDecode) {
VerifyDexFile();
diff --git a/runtime/verifier/verifier_deps.cc b/runtime/verifier/verifier_deps.cc
index 5f94a1bd9b..c4058d63ee 100644
--- a/runtime/verifier/verifier_deps.cc
+++ b/runtime/verifier/verifier_deps.cc
@@ -245,18 +245,18 @@ std::string VerifierDeps::GetStringFromId(const DexFile& dex_file, dex::StringIn
bool VerifierDeps::IsInClassPath(ObjPtr<mirror::Class> klass) const {
DCHECK(klass != nullptr);
- ObjPtr<mirror::DexCache> dex_cache = klass->GetDexCache();
- if (dex_cache == nullptr) {
- // This is a synthesized class, in this case always an array. They are not
- // defined in the compiled DEX files and therefore are part of the classpath.
- // We do not record dependencies on arrays with component types in
- // the compiled DEX files, as the only thing that might change is their
- // access flags. If we were to change these flags in a breaking way, we would
- // need to enforce full verification again anyways by updating the vdex version.
- DCHECK(klass->IsArrayClass()) << klass->PrettyDescriptor();
- return false;
+ // For array types, we return whether the non-array component type
+ // is in the classpath.
+ while (klass->IsArrayClass()) {
+ klass = klass->GetComponentType();
}
+ if (klass->IsPrimitive()) {
+ return true;
+ }
+
+ ObjPtr<mirror::DexCache> dex_cache = klass->GetDexCache();
+ DCHECK(dex_cache != nullptr);
const DexFile* dex_file = dex_cache->GetDexFile();
DCHECK(dex_file != nullptr);