Fix a handful of reflection bugs.
We now pass test 046.
Change-Id: Ie605ed99e64038435608fe388c59526674af5489
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 97a75ac..b495e3e 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1015,8 +1015,8 @@
klass->SetDescriptor(intern_table_->InternStrong(descriptor));
}
uint32_t access_flags = dex_class_def.access_flags_;
- // Make sure there aren't any "bonus" flags set, since we use them for runtime state.
- CHECK_EQ(access_flags & ~kAccClassFlagsMask, 0U);
+ // Make sure that none of our runtime-only flags are set.
+ CHECK_EQ(access_flags & ~kAccJavaFlagsMask, 0U);
klass->SetAccessFlags(access_flags);
klass->SetClassLoader(class_loader);
DCHECK(klass->GetPrimitiveType() == Class::kPrimNot);
diff --git a/src/java_lang_reflect_Field.cc b/src/java_lang_reflect_Field.cc
index 2937241..7d43b2e 100644
--- a/src/java_lang_reflect_Field.cc
+++ b/src/java_lang_reflect_Field.cc
@@ -26,7 +26,7 @@
namespace {
jint Field_getFieldModifiers(JNIEnv* env, jobject jfield, jclass javaDeclaringClass, jint slot) {
- return Decode<Object*>(env, jfield)->AsField()->GetAccessFlags() & kAccFieldFlagsMask;
+ return Decode<Object*>(env, jfield)->AsField()->GetAccessFlags() & kAccJavaFlagsMask;
}
bool GetFieldValue(Object* o, Field* f, JValue& value, bool allow_references) {
@@ -85,7 +85,7 @@
return true;
}
-JValue GetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jchar targetDescriptor) {
+JValue GetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jchar dst_descriptor) {
Field* f = DecodeField(env->FromReflectedField(javaField));
Object* o = NULL;
if (!CheckReceiver(env, javaObj, javaDeclaringClass, f, o)) {
@@ -100,43 +100,43 @@
// Widen it if necessary (and possible).
JValue wide_value;
- Class* targetType = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(targetDescriptor);
- if (!ConvertPrimitiveValue(f->GetType(), targetType, field_value, wide_value)) {
+ Class* dst_type = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(dst_descriptor);
+ if (!ConvertPrimitiveValue(f->GetType(), dst_type, field_value, wide_value)) {
return JValue();
}
return wide_value;
}
-jbyte Field_getBField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).b;
+jbyte Field_getBField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).b;
}
-jchar Field_getCField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).c;
+jchar Field_getCField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).c;
}
-jdouble Field_getDField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).d;
+jdouble Field_getDField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).d;
}
-jfloat Field_getFField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).f;
+jfloat Field_getFField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).f;
}
-jint Field_getIField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).i;
+jint Field_getIField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).i;
}
-jlong Field_getJField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).j;
+jlong Field_getJField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).j;
}
-jshort Field_getSField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).s;
+jshort Field_getSField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).s;
}
-jboolean Field_getZField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
- return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).z;
+jboolean Field_getZField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar dst_descriptor) {
+ return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, dst_descriptor).z;
}
void SetFieldValue(Object* o, Field* f, const JValue& new_value, bool allow_references) {
@@ -185,7 +185,7 @@
}
}
-void SetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jchar targetDescriptor, const JValue& new_value) {
+void SetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jchar src_descriptor, const JValue& new_value) {
Field* f = DecodeField(env->FromReflectedField(javaField));
Object* o = NULL;
if (!CheckReceiver(env, javaObj, javaDeclaringClass, f, o)) {
@@ -194,8 +194,8 @@
// Widen the value if necessary (and possible).
JValue wide_value;
- Class* targetType = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(targetDescriptor);
- if (!ConvertPrimitiveValue(f->GetType(), targetType, new_value, wide_value)) {
+ Class* src_type = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(src_descriptor);
+ if (!ConvertPrimitiveValue(src_type, f->GetType(), new_value, wide_value)) {
return;
}
@@ -203,52 +203,52 @@
SetFieldValue(o, f, wide_value, false);
}
-void Field_setBField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jbyte value) {
+void Field_setBField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jbyte value) {
JValue v = { 0 };
v.b = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setCField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jchar value) {
+void Field_setCField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jchar value) {
JValue v = { 0 };
v.c = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setDField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jdouble value) {
+void Field_setDField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jdouble value) {
JValue v = { 0 };
v.d = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setFField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jfloat value) {
+void Field_setFField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jfloat value) {
JValue v = { 0 };
v.f = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setIField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jint value) {
+void Field_setIField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jint value) {
JValue v = { 0 };
v.i = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setJField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jlong value) {
+void Field_setJField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jlong value) {
JValue v = { 0 };
v.j = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setSField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jshort value) {
+void Field_setSField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jshort value) {
JValue v = { 0 };
v.s = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
-void Field_setZField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jboolean value) {
+void Field_setZField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar src_descriptor, jboolean value) {
JValue v = { 0 };
v.z = value;
- SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
+ SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, src_descriptor, v);
}
void Field_setField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jobject javaValue) {
diff --git a/src/java_lang_reflect_Method.cc b/src/java_lang_reflect_Method.cc
index dc3f314..e36078f 100644
--- a/src/java_lang_reflect_Method.cc
+++ b/src/java_lang_reflect_Method.cc
@@ -35,7 +35,8 @@
if ((access_flags & kAccDeclaredSynchronized) != 0) {
access_flags |= kAccSynchronized;
}
- return access_flags & kAccMethodFlagsMask;
+
+ return access_flags & kAccJavaFlagsMask;
}
jint Method_getProtoIndex(JNIEnv* env, jclass, jclass javaDeclaringClass, jobject jmethod, jint slot) {
diff --git a/src/object.h b/src/object.h
index e5036e6..4b2b54a 100644
--- a/src/object.h
+++ b/src/object.h
@@ -77,7 +77,7 @@
static const uint32_t kAccStatic = 0x0008; // field, method, ic
static const uint32_t kAccFinal = 0x0010; // class, field, method, ic
static const uint32_t kAccSynchronized = 0x0020; // method (only allowed on natives)
-static const uint32_t kAccSuper = 0x0020; // class (not used in Dalvik)
+static const uint32_t kAccSuper = 0x0020; // class (not used in dex)
static const uint32_t kAccVolatile = 0x0040; // field
static const uint32_t kAccBridge = 0x0040; // method (1.5)
static const uint32_t kAccTransient = 0x0080; // field
@@ -94,44 +94,9 @@
static const uint32_t kAccJavaFlagsMask = 0xffff; // bits set from Java sources (low 16)
-static const uint32_t kAccConstructor = 0x00010000; // method (Dalvik only)
-static const uint32_t kAccDeclaredSynchronized = 0x00020000; // method (Dalvik only)
-static const uint32_t kAccWritable = 0x80000000; // method (Dalvik only)
-
-static const uint32_t kAccClassFlagsMask = (kAccPublic
- | kAccFinal
- | kAccInterface
- | kAccAbstract
- | kAccSynthetic
- | kAccAnnotation
- | kAccEnum);
-static const uint32_t kAccInnerClassFlagsMask = (kAccClassFlagsMask
- | kAccPrivate
- | kAccProtected
- | kAccStatic);
-static const uint32_t kAccFieldFlagsMask = (kAccPublic
- | kAccPrivate
- | kAccProtected
- | kAccStatic
- | kAccFinal
- | kAccVolatile
- | kAccTransient
- | kAccSynthetic
- | kAccEnum);
-static const uint32_t kAccMethodFlagsMask = (kAccPublic
- | kAccPrivate
- | kAccProtected
- | kAccStatic
- | kAccFinal
- | kAccSynchronized
- | kAccBridge
- | kAccVarargs
- | kAccNative
- | kAccAbstract
- | kAccStrict
- | kAccSynthetic
- | kAccConstructor
- | kAccDeclaredSynchronized);
+static const uint32_t kAccConstructor = 0x00010000; // method (dex only)
+static const uint32_t kAccDeclaredSynchronized = 0x00020000; // method (dex only)
+static const uint32_t kAccWritable = 0x80000000; // method (dex only)
// Special runtime-only flags.
// Note: if only kAccClassIsReference is set, we have a soft reference.
diff --git a/test/046-reflect/expected.txt b/test/046-reflect/expected.txt
index 55b0eca..b2bb176 100644
--- a/test/046-reflect/expected.txt
+++ b/test/046-reflect/expected.txt
@@ -81,8 +81,9 @@
Field type is int
Access flags are 0x11
cantTouchThis is 77
- got expected set-final failure
- cantTouchThis is now 77
+ setAccessible is always true
+ cantTouchThis is now 99
+ cantTouchThis is now 87
cantTouchThis is now 88
cons modifiers=1
SuperTarget constructor ()V
diff --git a/test/046-reflect/src/Main.java b/test/046-reflect/src/Main.java
index e604979..7b6036b 100644
--- a/test/046-reflect/src/Main.java
+++ b/test/046-reflect/src/Main.java
@@ -272,15 +272,17 @@
System.out.println(" cantTouchThis is " + intVal);
try {
field.setInt(instance, 99);
- System.out.println("ERROR: set-final succeeded");
+ System.out.println(" setAccessible is always true");
} catch (IllegalAccessException iae) {
- System.out.println(" got expected set-final failure");
+ System.out.println("ERROR: set-final failed");
}
intVal = field.getInt(instance);
System.out.println(" cantTouchThis is now " + intVal);
field.setAccessible(true);
field.setInt(instance, 87); // exercise int version
+ intVal = field.getInt(instance);
+ System.out.println(" cantTouchThis is now " + intVal);
field.set(instance, 88); // exercise Object version
intVal = field.getInt(instance);
System.out.println(" cantTouchThis is now " + intVal);