Use Java strings for Field's name.
Change-Id: Ia75c9c0ed0a802e52e415d856a101affb9fddd8a
diff --git a/src/class_linker.cc b/src/class_linker.cc
index d3d1a96..593b3e0 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -49,11 +49,17 @@
Class* object_array_class = AllocClass(java_lang_Class);
CHECK(object_array_class != NULL);
+ // string is necessary so that FindClass can assigning names to members
+ Class* java_lang_String = AllocClass(java_lang_Class);
+ CHECK(java_lang_String != NULL);
+ java_lang_String->object_size_ = sizeof(String);
+
// create storage for root classes, save away our work so far
class_roots_ = ObjectArray<Class>::Alloc(object_array_class, kClassRootsMax);
class_roots_->Set(kJavaLangClass, java_lang_Class);
class_roots_->Set(kJavaLangObject, java_lang_Object);
class_roots_->Set(kObjectArrayClass, object_array_class);
+ class_roots_->Set(kJavaLangString, java_lang_String);
// now that these are registered, we can use AllocClass() and AllocObjectArray
// setup boot_class_path_ now that we can use AllocObjectArray to
@@ -88,8 +94,7 @@
java_lang_reflect_Method->object_size_ = sizeof(Method);
class_roots_->Set(kJavaLangReflectMethod, java_lang_reflect_Method);
- Class* java_lang_String = FindSystemClass("Ljava/lang/String;");
- CHECK(java_lang_String != NULL);
+ FindSystemClass("Ljava/lang/String;");
CHECK_EQ(java_lang_String->object_size_, sizeof(String));
java_lang_String->object_size_ = sizeof(String);
class_roots_->Set(kJavaLangString, java_lang_String);
@@ -235,6 +240,8 @@
klass = class_roots_->Get(kJavaLangObject);
} else if (descriptor == "Ljava/lang/Class;") {
klass = class_roots_->Get(kJavaLangClass);
+ } else if (descriptor == "Ljava/lang/String;") {
+ klass = class_roots_->Get(kJavaLangString);
} else {
klass = AllocClass();
}
@@ -408,7 +415,7 @@
Field* dst) {
const DexFile::FieldId& field_id = dex_file.GetFieldId(src.field_idx_);
dst->klass_ = klass;
- dst->name_.set(dex_file.dexStringById(field_id.name_idx_));
+ dst->java_name_ = ResolveString(klass, field_id.name_idx_);
dst->descriptor_.set(dex_file.dexStringByTypeIdx(field_id.type_idx_));
dst->access_flags_ = src.access_flags_;
}
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index cdcf8fb..b71baef 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -405,37 +405,37 @@
UseLibCoreDex();
Class* string = class_linker_->FindClass( "Ljava/lang/String;", NULL, java_lang_dex_file_.get());
ASSERT_EQ(4U, string->NumInstanceFields());
- EXPECT_EQ("value", string->GetInstanceField(0)->GetName());
- EXPECT_EQ("hashCode", string->GetInstanceField(1)->GetName());
- EXPECT_EQ("offset", string->GetInstanceField(2)->GetName());
- EXPECT_EQ("count", string->GetInstanceField(3)->GetName());
+ EXPECT_PRED2(String::Equals, string->GetInstanceField(0)->GetName(), "value");
+ EXPECT_PRED2(String::Equals, string->GetInstanceField(1)->GetName(), "hashCode");
+ EXPECT_PRED2(String::Equals, string->GetInstanceField(2)->GetName(), "offset");
+ EXPECT_PRED2(String::Equals, string->GetInstanceField(3)->GetName(), "count");
Class* accessible_object = class_linker_->FindClass("Ljava/lang/reflect/AccessibleObject;", NULL, java_lang_dex_file_.get());
ASSERT_EQ(1U, accessible_object->NumInstanceFields());
- EXPECT_EQ("flag", accessible_object->GetInstanceField(0)->GetName());
+ EXPECT_PRED2(String::Equals, accessible_object->GetInstanceField(0)->GetName(), "flag");
Class* field = class_linker_->FindClass("Ljava/lang/reflect/Field;", NULL, java_lang_dex_file_.get());
ASSERT_EQ(6U, field->NumInstanceFields());
- EXPECT_EQ("declaringClass", field->GetInstanceField(0)->GetName());
- EXPECT_EQ("genericType", field->GetInstanceField(1)->GetName());
- EXPECT_EQ("type", field->GetInstanceField(2)->GetName());
- EXPECT_EQ("name", field->GetInstanceField(3)->GetName());
- EXPECT_EQ("slot", field->GetInstanceField(4)->GetName());
- EXPECT_EQ("genericTypesAreInitialized", field->GetInstanceField(5)->GetName());
+ EXPECT_PRED2(String::Equals, field->GetInstanceField(0)->GetName(), "declaringClass");
+ EXPECT_PRED2(String::Equals, field->GetInstanceField(1)->GetName(), "genericType");
+ EXPECT_PRED2(String::Equals, field->GetInstanceField(2)->GetName(), "type");
+ EXPECT_PRED2(String::Equals, field->GetInstanceField(3)->GetName(), "name");
+ EXPECT_PRED2(String::Equals, field->GetInstanceField(4)->GetName(), "slot");
+ EXPECT_PRED2(String::Equals, field->GetInstanceField(5)->GetName(), "genericTypesAreInitialized");
Class* method = class_linker_->FindClass("Ljava/lang/reflect/Method;", NULL, java_lang_dex_file_.get());
ASSERT_EQ(11U, method->NumInstanceFields());
- EXPECT_EQ("declaringClass", method->GetInstanceField( 0)->GetName());
- EXPECT_EQ("exceptionTypes", method->GetInstanceField( 1)->GetName());
- EXPECT_EQ("formalTypeParameters", method->GetInstanceField( 2)->GetName());
- EXPECT_EQ("genericExceptionTypes", method->GetInstanceField( 3)->GetName());
- EXPECT_EQ("genericParameterTypes", method->GetInstanceField( 4)->GetName());
- EXPECT_EQ("genericReturnType", method->GetInstanceField( 5)->GetName());
- EXPECT_EQ("returnType", method->GetInstanceField( 6)->GetName());
- EXPECT_EQ("name", method->GetInstanceField( 7)->GetName());
- EXPECT_EQ("parameterTypes", method->GetInstanceField( 8)->GetName());
- EXPECT_EQ("genericTypesAreInitialized", method->GetInstanceField( 9)->GetName());
- EXPECT_EQ("slot", method->GetInstanceField(10)->GetName());
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 0)->GetName(), "declaringClass");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 1)->GetName(), "exceptionTypes");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 2)->GetName(), "formalTypeParameters");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 3)->GetName(), "genericExceptionTypes");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 4)->GetName(), "genericParameterTypes");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 5)->GetName(), "genericReturnType");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 6)->GetName(), "returnType");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 7)->GetName(), "name");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 8)->GetName(), "parameterTypes");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField( 9)->GetName(), "genericTypesAreInitialized");
+ EXPECT_PRED2(String::Equals, method->GetInstanceField(10)->GetName(), "slot");
}
} // namespace art
diff --git a/src/object.h b/src/object.h
index a9bf40f..0f89411 100644
--- a/src/object.h
+++ b/src/object.h
@@ -257,8 +257,8 @@
return declaring_class_;
}
- const StringPiece& GetName() const {
- return name_;
+ const String* GetName() const {
+ return java_name_;
}
char GetType() const { // TODO: return type
@@ -986,6 +986,7 @@
std::ostream& operator<<(std::ostream& os, const Class::Status& rhs);
inline Object* Object::Alloc(Class* klass) {
+ DCHECK(klass != NULL);
return Heap::AllocObject(klass, klass->object_size_);
}