Make sure that array_iftables_ is initialized when loading from an image.
This fixes test 009-instanceof2.
Change-Id: Ieba95a295e34381aeb16f5950376ff8700b624de
diff --git a/src/class_linker.cc b/src/class_linker.cc
index ff3c6be..c7006df 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -515,6 +515,9 @@
// if possible add new checks there to catch errors early
}
+ CHECK(array_iftable_ != NULL);
+ CHECK(array_interfaces_ != NULL);
+
// disable the slow paths in FindClass and CreatePrimitiveClass now
// that Object, Class, and Object[] are setup
init_done_ = true;
@@ -614,9 +617,11 @@
Object* class_roots_object = spaces[0]->GetImageHeader().GetImageRoot(ImageHeader::kClassRoots);
class_roots_ = class_roots_object->AsObjectArray<Class>();
- // reinit array_interfaces_ from any array class instance, they should all be ==
+ // reinit array_interfaces_ and array_iftable_ from any array class instance, they should all be ==
array_interfaces_ = GetClassRoot(kObjectArrayClass)->GetInterfaces();
DCHECK(array_interfaces_ == GetClassRoot(kBooleanArrayClass)->GetInterfaces());
+ array_iftable_ = GetClassRoot(kObjectArrayClass)->GetIfTable();
+ DCHECK(array_iftable_ == GetClassRoot(kBooleanArrayClass)->GetIfTable());
String::SetClass(GetClassRoot(kJavaLangString));
Field::SetClass(GetClassRoot(kJavaLangReflectField));
@@ -1275,6 +1280,8 @@
// Use the single, global copies of "interfaces" and "iftable"
// (remember not to free them for arrays).
+ CHECK(array_interfaces_ != NULL);
+ CHECK(array_iftable_ != NULL);
new_class->SetInterfaces(array_interfaces_);
new_class->SetIfTable(array_iftable_);
diff --git a/src/object_test.cc b/src/object_test.cc
index 167c770..c13a19d 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -343,10 +343,18 @@
EXPECT_TRUE(y->InstanceOf(X));
EXPECT_TRUE(y->InstanceOf(Y));
- Class* Class_class = class_linker_->FindSystemClass("Ljava/lang/Class;");
+ Class* java_lang_Class = class_linker_->FindSystemClass("Ljava/lang/Class;");
Class* Object_array_class = class_linker_->FindSystemClass("[Ljava/lang/Object;");
- EXPECT_FALSE(Class_class->InstanceOf(Object_array_class));
- EXPECT_TRUE(Object_array_class->InstanceOf(Class_class));
+
+ EXPECT_FALSE(java_lang_Class->InstanceOf(Object_array_class));
+ EXPECT_TRUE(Object_array_class->InstanceOf(java_lang_Class));
+
+ // All array classes implement Cloneable and Serializable.
+ Object* array = ObjectArray<Object>::Alloc(Object_array_class, 1);
+ Class* java_lang_Cloneable = class_linker_->FindSystemClass("Ljava/lang/Cloneable;");
+ Class* java_io_Serializable = class_linker_->FindSystemClass("Ljava/io/Serializable;");
+ EXPECT_TRUE(array->InstanceOf(java_lang_Cloneable));
+ EXPECT_TRUE(array->InstanceOf(java_io_Serializable));
}
TEST_F(ObjectTest, IsAssignableFrom) {