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());
   }