Enforce the use of accessors on JValue so we can ensure sign extension.
Change-Id: I34810af7661d8674c84707afe5cfdf9e2c233f8b
diff --git a/src/java_lang_reflect_Field.cc b/src/java_lang_reflect_Field.cc
index 7cc4166..fe9f79c 100644
--- a/src/java_lang_reflect_Field.cc
+++ b/src/java_lang_reflect_Field.cc
@@ -25,41 +25,39 @@
namespace art {
static bool GetFieldValue(Object* o, Field* f, JValue& value, bool allow_references) {
- DCHECK_EQ(value.j, 0LL);
+ DCHECK_EQ(value.GetJ(), 0LL);
ScopedThreadStateChange tsc(Thread::Current(), kRunnable);
if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(f->GetDeclaringClass(), true, true)) {
return false;
}
switch (FieldHelper(f).GetTypeAsPrimitiveType()) {
case Primitive::kPrimBoolean:
- value.z = f->GetBoolean(o);
+ value.SetZ(f->GetBoolean(o));
return true;
case Primitive::kPrimByte:
- // Read byte and ensure it is fully sign-extended to an int.
- value.i = ((int32_t)f->GetByte(o) << 24) >> 24;
+ value.SetB(f->GetByte(o));
return true;
case Primitive::kPrimChar:
- value.c = f->GetChar(o);
+ value.SetC(f->GetChar(o));
return true;
case Primitive::kPrimDouble:
- value.d = f->GetDouble(o);
+ value.SetD(f->GetDouble(o));
return true;
case Primitive::kPrimFloat:
- value.f = f->GetFloat(o);
+ value.SetF(f->GetFloat(o));
return true;
case Primitive::kPrimInt:
- value.i = f->GetInt(o);
+ value.SetI(f->GetInt(o));
return true;
case Primitive::kPrimLong:
- value.j = f->GetLong(o);
+ value.SetJ(f->GetLong(o));
return true;
case Primitive::kPrimShort:
- // Read short and ensure it is fully sign-extended to an int.
- value.i = ((int32_t)f->GetShort(o) << 16) >> 16;
+ value.SetS(f->GetShort(o));
return true;
case Primitive::kPrimNot:
if (allow_references) {
- value.l = f->GetObject(o);
+ value.SetL(f->GetObject(o));
return true;
}
// Else break to report an error.
@@ -101,7 +99,7 @@
}
BoxPrimitive(FieldHelper(f).GetTypeAsPrimitiveType(), value);
- return AddLocalReference<jobject>(env, value.l);
+ return AddLocalReference<jobject>(env, value.GetL());
}
static JValue GetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, char dst_descriptor) {
@@ -128,35 +126,35 @@
}
static jboolean Field_getBoolean(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'Z').z;
+ return GetPrimitiveField(env, javaField, javaObj, 'Z').GetZ();
}
static jbyte Field_getByte(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'B').b;
+ return GetPrimitiveField(env, javaField, javaObj, 'B').GetB();
}
static jchar Field_getChar(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'C').c;
+ return GetPrimitiveField(env, javaField, javaObj, 'C').GetC();
}
static jdouble Field_getDouble(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'D').d;
+ return GetPrimitiveField(env, javaField, javaObj, 'D').GetD();
}
static jfloat Field_getFloat(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'F').f;
+ return GetPrimitiveField(env, javaField, javaObj, 'F').GetF();
}
static jint Field_getInt(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'I').i;
+ return GetPrimitiveField(env, javaField, javaObj, 'I').GetI();
}
static jlong Field_getLong(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'J').j;
+ return GetPrimitiveField(env, javaField, javaObj, 'J').GetJ();
}
static jshort Field_getShort(JNIEnv* env, jobject javaField, jobject javaObj) {
- return GetPrimitiveField(env, javaField, javaObj, 'S').s;
+ return GetPrimitiveField(env, javaField, javaObj, 'S').GetS();
}
static void SetFieldValue(Object* o, Field* f, const JValue& new_value, bool allow_references) {
@@ -165,32 +163,32 @@
}
switch (FieldHelper(f).GetTypeAsPrimitiveType()) {
case Primitive::kPrimBoolean:
- f->SetBoolean(o, new_value.z);
+ f->SetBoolean(o, new_value.GetZ());
break;
case Primitive::kPrimByte:
- f->SetByte(o, new_value.b);
+ f->SetByte(o, new_value.GetB());
break;
case Primitive::kPrimChar:
- f->SetChar(o, new_value.c);
+ f->SetChar(o, new_value.GetC());
break;
case Primitive::kPrimDouble:
- f->SetDouble(o, new_value.d);
+ f->SetDouble(o, new_value.GetD());
break;
case Primitive::kPrimFloat:
- f->SetFloat(o, new_value.f);
+ f->SetFloat(o, new_value.GetF());
break;
case Primitive::kPrimInt:
- f->SetInt(o, new_value.i);
+ f->SetInt(o, new_value.GetI());
break;
case Primitive::kPrimLong:
- f->SetLong(o, new_value.j);
+ f->SetLong(o, new_value.GetJ());
break;
case Primitive::kPrimShort:
- f->SetShort(o, new_value.s);
+ f->SetShort(o, new_value.GetS());
break;
case Primitive::kPrimNot:
if (allow_references) {
- f->SetObject(o, new_value.l);
+ f->SetObject(o, new_value.GetL());
break;
}
// Else fall through to report an error.
@@ -255,52 +253,52 @@
SetFieldValue(o, f, wide_value, false);
}
-static void Field_setBoolean(JNIEnv* env, jobject javaField, jobject javaObj, jboolean value) {
- JValue v;
- v.z = value;
- SetPrimitiveField(env, javaField, javaObj, 'Z', v);
+static void Field_setBoolean(JNIEnv* env, jobject javaField, jobject javaObj, jboolean z) {
+ JValue value;
+ value.SetZ(z);
+ SetPrimitiveField(env, javaField, javaObj, 'Z', value);
}
-static void Field_setByte(JNIEnv* env, jobject javaField, jobject javaObj, jbyte value) {
- JValue v;
- v.b = value;
- SetPrimitiveField(env, javaField, javaObj, 'B', v);
+static void Field_setByte(JNIEnv* env, jobject javaField, jobject javaObj, jbyte b) {
+ JValue value;
+ value.SetB(b);
+ SetPrimitiveField(env, javaField, javaObj, 'B', value);
}
-static void Field_setChar(JNIEnv* env, jobject javaField, jobject javaObj, jchar value) {
- JValue v;
- v.c = value;
- SetPrimitiveField(env, javaField, javaObj, 'C', v);
+static void Field_setChar(JNIEnv* env, jobject javaField, jobject javaObj, jchar c) {
+ JValue value;
+ value.SetC(c);
+ SetPrimitiveField(env, javaField, javaObj, 'C', value);
}
-static void Field_setDouble(JNIEnv* env, jobject javaField, jobject javaObj, jdouble value) {
- JValue v;
- v.d = value;
- SetPrimitiveField(env, javaField, javaObj, 'D', v);
+static void Field_setDouble(JNIEnv* env, jobject javaField, jobject javaObj, jdouble d) {
+ JValue value;
+ value.SetD(d);
+ SetPrimitiveField(env, javaField, javaObj, 'D', value);
}
-static void Field_setFloat(JNIEnv* env, jobject javaField, jobject javaObj, jfloat value) {
- JValue v;
- v.f = value;
- SetPrimitiveField(env, javaField, javaObj, 'F', v);
+static void Field_setFloat(JNIEnv* env, jobject javaField, jobject javaObj, jfloat f) {
+ JValue value;
+ value.SetF(f);
+ SetPrimitiveField(env, javaField, javaObj, 'F', value);
}
-static void Field_setInt(JNIEnv* env, jobject javaField, jobject javaObj, jint value) {
- JValue v;
- v.i = value;
- SetPrimitiveField(env, javaField, javaObj, 'I', v);
+static void Field_setInt(JNIEnv* env, jobject javaField, jobject javaObj, jint i) {
+ JValue value;
+ value.SetI(i);
+ SetPrimitiveField(env, javaField, javaObj, 'I', value);
}
-static void Field_setLong(JNIEnv* env, jobject javaField, jobject javaObj, jlong value) {
- JValue v;
- v.j = value;
- SetPrimitiveField(env, javaField, javaObj, 'J', v);
+static void Field_setLong(JNIEnv* env, jobject javaField, jobject javaObj, jlong j) {
+ JValue value;
+ value.SetJ(j);
+ SetPrimitiveField(env, javaField, javaObj, 'J', value);
}
-static void Field_setShort(JNIEnv* env, jobject javaField, jobject javaObj, jshort value) {
- JValue v;
- v.s = value;
- SetPrimitiveField(env, javaField, javaObj, 'S', v);
+static void Field_setShort(JNIEnv* env, jobject javaField, jobject javaObj, jshort s) {
+ JValue value;
+ value.SetS(s);
+ SetPrimitiveField(env, javaField, javaObj, 'S', value);
}
static JNINativeMethod gMethods[] = {