Change Class::component_type_ and implement reflect.Array
Change-Id: I9e06f31577551c738eca2621146c8d2328119442
diff --git a/src/object.cc b/src/object.cc
index 7f247c7..6490797 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -794,52 +794,29 @@
// Don't forget about primitive types.
// Object[] = int[] --> false
//
-bool Class::IsArrayAssignableFromArray(const Class* klass) const {
+bool Class::IsArrayAssignableFromArray(const Class* src) const {
DCHECK(IsArrayClass());
- DCHECK(klass->IsArrayClass());
- DCHECK_GT(GetArrayRank(), 0);
- DCHECK_GT(klass->GetArrayRank(), 0);
- DCHECK(GetComponentType() != NULL);
- DCHECK(klass->GetComponentType() != NULL);
- if (GetArrayRank() > klass->GetArrayRank()) {
- // Too many []s.
- return false;
- }
- if (GetArrayRank() == klass->GetArrayRank()) {
- return GetComponentType()->IsAssignableFrom(klass->GetComponentType());
- }
- DCHECK_LT(GetArrayRank(), klass->GetArrayRank());
- // The thing we might be assignable from has more dimensions. We
- // must be an Object or array of Object, or a standard array
- // interface or array of standard array interfaces (the standard
- // interfaces being java/lang/Cloneable and java/io/Serializable).
- if (GetComponentType()->IsInterface()) {
- // See if we implement our component type. We know the
- // base element is an interface; if the array class implements
- // it, we know it's a standard array interface.
- return Implements(GetComponentType());
- }
- // See if this is an array of Object, Object[], etc.
- return GetComponentType()->IsObjectClass();
+ DCHECK(src->IsArrayClass());
+ return GetComponentType()->IsAssignableFrom(src->GetComponentType());
}
-bool Class::IsAssignableFromArray(const Class* klass) const {
+bool Class::IsAssignableFromArray(const Class* src) const {
DCHECK(!IsInterface()); // handled first in IsAssignableFrom
- DCHECK(klass->IsArrayClass());
+ DCHECK(src->IsArrayClass());
if (!IsArrayClass()) {
// If "this" is not also an array, it must be Object.
- // klass's super should be java_lang_Object, since it is an array.
- Class* java_lang_Object = klass->GetSuperClass();
+ // src's super should be java_lang_Object, since it is an array.
+ Class* java_lang_Object = src->GetSuperClass();
DCHECK(java_lang_Object != NULL);
DCHECK(java_lang_Object->GetSuperClass() == NULL);
return this == java_lang_Object;
}
- return IsArrayAssignableFromArray(klass);
+ return IsArrayAssignableFromArray(src);
}
bool Class::IsSubClass(const Class* klass) const {
DCHECK(!IsInterface());
- DCHECK(!klass->IsArrayClass());
+ DCHECK(!IsArrayClass());
const Class* current = this;
do {
if (current == klass) {