Merge "Add verifier assignability for unresolved arrays to Object[]" into dalvik-dev
diff --git a/src/dex_verifier.cc b/src/dex_verifier.cc
index 8776458..c03b724 100644
--- a/src/dex_verifier.cc
+++ b/src/dex_verifier.cc
@@ -209,6 +209,8 @@
return true; // all reference types can be assigned to Object
} else if (!IsUnresolvedTypes() && GetClass()->IsInterface()) {
return true; // We allow assignment to any interface, see comment in ClassJoin
+ } else if (IsJavaLangObjectArray()) {
+ return src.IsObjectArray(); // All reference arrays may be assigned to Object[]
} else if (!IsUnresolvedTypes() && !src.IsUnresolvedTypes() &&
GetClass()->IsAssignableFrom(src.GetClass())) {
// We're assignable from the Class point-of-view
diff --git a/src/dex_verifier.h b/src/dex_verifier.h
index 0488ba3..032e777 100644
--- a/src/dex_verifier.h
+++ b/src/dex_verifier.h
@@ -212,6 +212,24 @@
bool IsJavaLangObject() const {
return IsReference() && GetClass()->IsObjectClass();
}
+ bool IsObjectArray() const {
+ if (IsReference()) {
+ Class* type = GetClass();
+ return type->IsArrayClass() && !type->GetComponentType()->IsPrimitive();
+ } else if (IsUnresolvedTypes()) {
+ // Primitive arrays will always resolve
+ DCHECK(GetDescriptor()->CharAt(1) == 'L' || GetDescriptor()->CharAt(1) == '[');
+ return GetDescriptor()->CharAt(0) == '[';
+ }
+ return false;
+ }
+ bool IsJavaLangObjectArray() const {
+ if (IsReference()) {
+ Class* type = GetClass();
+ return type->IsArrayClass() && type->GetComponentType()->IsObjectClass();
+ }
+ return false;
+ }
bool IsInstantiableTypes() const {
return IsUnresolvedTypes() || (IsNonZeroReferenceTypes() && GetClass()->IsInstantiable());
}