Implement Class.getDeclared(Constructors|Fields|Methods).
This required making sure that a Method* that represents a constructor
has java.lang.reflect.Constructor as its class.
Change-Id: I25908845a2b8d686d5404ac584693db0edd5853c
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index c3b063c..ba67402 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -298,9 +298,9 @@
CheckOffset(size_t c, const char* j) : cpp_offset(c), java_name(j) {}
};
+template <typename T>
struct CheckOffsets {
bool instance;
- size_t size;
std::string class_descriptor;
std::vector<CheckOffset> offsets;
@@ -312,11 +312,11 @@
if (!klass->IsClassClass() && instance) {
size_t expected_size = instance ? klass->GetObjectSize() : klass->GetClassSize();
- if (size != expected_size) {
+ if (sizeof(T) != expected_size) {
LG << "Class size mismatch:"
<< " class=" << class_descriptor
- << " Java=" << klass->GetObjectSize()
- << " C++=" << expected_size;
+ << " Java=" << expected_size
+ << " C++=" << sizeof(T);
error = true;
}
}
@@ -376,10 +376,9 @@
// Note that ClassLinkerTest.ValidateFieldOrderOfJavaCppUnionClasses
// is first since if it is failing, others are unlikely to succeed.
-struct ObjectOffsets : public CheckOffsets {
+struct ObjectOffsets : public CheckOffsets<Object> {
ObjectOffsets() {
instance = true;
- size = sizeof(Object);
class_descriptor = "Ljava/lang/Object;";
// alphabetical references
@@ -390,19 +389,17 @@
};
};
-struct AccessibleObjectOffsets : public CheckOffsets {
+struct AccessibleObjectOffsets : public CheckOffsets<AccessibleObject> {
AccessibleObjectOffsets() {
instance = true;
- size = sizeof(AccessibleObject);
class_descriptor = "Ljava/lang/reflect/AccessibleObject;";
offsets.push_back(CheckOffset(OFFSETOF_MEMBER(AccessibleObject, java_flag_), "flag"));
};
};
-struct FieldOffsets : public CheckOffsets {
+struct FieldOffsets : public CheckOffsets<Field> {
FieldOffsets() {
instance = true;
- size = sizeof(Field);
class_descriptor = "Ljava/lang/reflect/Field;";
// alphabetical references
@@ -420,10 +417,9 @@
};
};
-struct MethodOffsets : public CheckOffsets {
+struct MethodOffsets : public CheckOffsets<Method> {
MethodOffsets() {
instance = true;
- size = sizeof(Method);
class_descriptor = "Ljava/lang/reflect/Method;";
// alphabetical references
@@ -472,10 +468,16 @@
};
};
-struct ClassOffsets : public CheckOffsets {
+struct ConstructorOffsets : public MethodOffsets {
+ ConstructorOffsets() : MethodOffsets() {
+ // We use Method* for both java.lang.reflect.Constructor and java.lang.reflect.Method.
+ class_descriptor = "Ljava/lang/reflect/Constructor;";
+ }
+};
+
+struct ClassOffsets : public CheckOffsets<Class> {
ClassOffsets() {
instance = true;
- size = sizeof(Class);
class_descriptor = "Ljava/lang/Class;";
// alphabetical references
@@ -511,10 +513,9 @@
};
};
-struct StringOffsets : public CheckOffsets {
+struct StringOffsets : public CheckOffsets<String> {
StringOffsets() {
instance = true;
- size = sizeof(String);
class_descriptor = "Ljava/lang/String;";
// alphabetical references
@@ -527,10 +528,9 @@
};
};
-struct ThrowableOffsets : public CheckOffsets {
+struct ThrowableOffsets : public CheckOffsets<Throwable> {
ThrowableOffsets() {
instance = true;
- size = sizeof(Throwable);
class_descriptor = "Ljava/lang/Throwable;";
// alphabetical references
@@ -542,10 +542,9 @@
};
};
-struct StackTraceElementOffsets : public CheckOffsets {
+struct StackTraceElementOffsets : public CheckOffsets<StackTraceElement> {
StackTraceElementOffsets() {
instance = true;
- size = sizeof(StackTraceElement);
class_descriptor = "Ljava/lang/StackTraceElement;";
// alphabetical references
@@ -556,10 +555,9 @@
};
};
-struct ClassLoaderOffsets : public CheckOffsets {
+struct ClassLoaderOffsets : public CheckOffsets<ClassLoader> {
ClassLoaderOffsets() {
instance = true;
- size = sizeof(ClassLoader);
class_descriptor = "Ljava/lang/ClassLoader;";
// alphabetical references
@@ -568,10 +566,9 @@
};
};
-struct BaseDexClassLoaderOffsets : public CheckOffsets {
+struct BaseDexClassLoaderOffsets : public CheckOffsets<BaseDexClassLoader> {
BaseDexClassLoaderOffsets() {
instance = true;
- size = sizeof(BaseDexClassLoader);
class_descriptor = "Ldalvik/system/BaseDexClassLoader;";
// alphabetical references
@@ -580,18 +577,16 @@
};
};
-struct PathClassLoaderOffsets : public CheckOffsets {
+struct PathClassLoaderOffsets : public CheckOffsets<PathClassLoader> {
PathClassLoaderOffsets() {
instance = true;
- size = sizeof(PathClassLoader);
class_descriptor = "Ldalvik/system/PathClassLoader;";
};
};
-struct ClassClassOffsets : public CheckOffsets {
+struct ClassClassOffsets : public CheckOffsets<ClassClass> {
ClassClassOffsets() {
instance = false;
- size = sizeof(ClassClass);
class_descriptor = "Ljava/lang/Class;";
// padding 32-bit
@@ -603,10 +598,9 @@
};
};
-struct StringClassOffsets : public CheckOffsets {
+struct StringClassOffsets : public CheckOffsets<StringClass> {
StringClassOffsets() {
instance = false;
- size = sizeof(StringClass);
class_descriptor = "Ljava/lang/String;";
// alphabetical references
@@ -621,10 +615,9 @@
};
};
-struct FieldClassOffsets : public CheckOffsets {
+struct FieldClassOffsets : public CheckOffsets<FieldClass> {
FieldClassOffsets() {
instance = false;
- size = sizeof(FieldClass);
class_descriptor = "Ljava/lang/reflect/Field;";
// alphabetical references
@@ -642,10 +635,9 @@
};
};
-struct MethodClassOffsets : public CheckOffsets {
+struct MethodClassOffsets : public CheckOffsets<MethodClass> {
MethodClassOffsets() {
instance = false;
- size = sizeof(MethodClass);
class_descriptor = "Ljava/lang/reflect/Method;";
// alphabetical references
@@ -660,6 +652,7 @@
TEST_F(ClassLinkerTest, ValidateFieldOrderOfJavaCppUnionClasses) {
EXPECT_TRUE(ObjectOffsets().Check());
EXPECT_TRUE(AccessibleObjectOffsets().Check());
+ EXPECT_TRUE(ConstructorOffsets().Check());
EXPECT_TRUE(FieldOffsets().Check());
EXPECT_TRUE(MethodOffsets().Check());
EXPECT_TRUE(ClassOffsets().Check());