Add compiler allocation paths Class::NewInstanceFromCode and Array::AllocFromCode
Change-Id: I604377656f182f29692cda757dc7fdb4acc938b9
diff --git a/src/object_test.cc b/src/object_test.cc
index fc58778..c7ddde9 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -37,6 +37,18 @@
}
EXPECT_EQ(hash_expected, string->GetHashCode());
}
+
+ uint32_t FindTypeIdxByDescriptor(const DexFile& dex_file, const StringPiece& descriptor) {
+ for (size_t i = 0; i < dex_file.NumTypeIds(); i++) {
+ const DexFile::TypeId& type_id = dex_file.GetTypeId(i);
+ if (descriptor == dex_file.GetTypeDescriptor(type_id)) {
+ return i;
+ }
+ }
+ CHECK(false) << "Could not find type index for " << descriptor;
+ return 0;
+ }
+
};
TEST_F(ObjectTest, IsInSamePackage) {
@@ -154,6 +166,27 @@
TestPrimitiveArray<ShortArray>(class_linker_);
}
+TEST_F(ObjectTest, AllocObjectFromCode) {
+ // pretend we are trying to call 'new String' from Object.toString
+ Class* java_lang_Object = class_linker_->FindSystemClass("Ljava/lang/Object;");
+ Method* toString = java_lang_Object->FindVirtualMethod("toString", "()Ljava/lang/String;");
+ uint32_t type_idx = FindTypeIdxByDescriptor(*java_lang_dex_file_.get(), "Ljava/lang/String;");
+ Object* string = Class::NewInstanceFromCode(type_idx, toString);
+ EXPECT_TRUE(string->IsString());
+}
+
+TEST_F(ObjectTest, AllocArrayFromCode) {
+ // pretend we are trying to call 'new char[3]' from String.toCharArray
+ Class* java_lang_String = class_linker_->FindSystemClass("Ljava/lang/String;");
+ Method* toCharArray = java_lang_String->FindVirtualMethod("toCharArray", "()[C");
+ uint32_t type_idx = FindTypeIdxByDescriptor(*java_lang_dex_file_.get(), "[C");
+ Object* array = Array::AllocFromCode(type_idx, toCharArray, 3);
+ EXPECT_TRUE(array->IsArrayInstance());
+ EXPECT_EQ(3, array->AsArray()->GetLength());
+ EXPECT_TRUE(array->GetClass()->IsArrayClass());
+ EXPECT_TRUE(array->GetClass()->GetComponentType()->IsPrimitive());
+}
+
TEST_F(ObjectTest, String) {
// Test the empty string.
AssertString(0, "", "", 0);