Make ResolveField not rely on Field::GetType resolution
Change-Id: I10f4a874809ac9db2cd54e200cf10eb7c8979fce
diff --git a/src/java_lang_reflect_Field.cc b/src/java_lang_reflect_Field.cc
index 7d43b2e..a2f09e7 100644
--- a/src/java_lang_reflect_Field.cc
+++ b/src/java_lang_reflect_Field.cc
@@ -30,39 +30,39 @@
}
bool GetFieldValue(Object* o, Field* f, JValue& value, bool allow_references) {
- switch (f->GetType()->GetPrimitiveType()) {
- case Class::kPrimBoolean:
+ switch (f->GetPrimitiveType()) {
+ case Primitive::kPrimBoolean:
value.z = f->GetBoolean(o);
return true;
- case Class::kPrimByte:
+ case Primitive::kPrimByte:
value.b = f->GetByte(o);
return true;
- case Class::kPrimChar:
+ case Primitive::kPrimChar:
value.c = f->GetChar(o);
return true;
- case Class::kPrimDouble:
+ case Primitive::kPrimDouble:
value.d = f->GetDouble(o);
return true;
- case Class::kPrimFloat:
+ case Primitive::kPrimFloat:
value.f = f->GetFloat(o);
return true;
- case Class::kPrimInt:
+ case Primitive::kPrimInt:
value.i = f->GetInt(o);
return true;
- case Class::kPrimLong:
+ case Primitive::kPrimLong:
value.j = f->GetLong(o);
return true;
- case Class::kPrimShort:
+ case Primitive::kPrimShort:
value.s = f->GetShort(o);
return true;
- case Class::kPrimNot:
+ case Primitive::kPrimNot:
if (allow_references) {
value.l = f->GetObject(o);
return true;
}
// Else break to report an error.
break;
- case Class::kPrimVoid:
+ case Primitive::kPrimVoid:
// Never okay.
break;
}
@@ -101,7 +101,8 @@
// Widen it if necessary (and possible).
JValue wide_value;
Class* dst_type = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(dst_descriptor);
- if (!ConvertPrimitiveValue(f->GetType(), dst_type, field_value, wide_value)) {
+ if (!ConvertPrimitiveValue(f->GetPrimitiveType(), dst_type->GetPrimitiveType(),
+ field_value, wide_value)) {
return JValue();
}
return wide_value;
@@ -140,38 +141,38 @@
}
void SetFieldValue(Object* o, Field* f, const JValue& new_value, bool allow_references) {
- switch (f->GetType()->GetPrimitiveType()) {
- case Class::kPrimBoolean:
+ switch (f->GetPrimitiveType()) {
+ case Primitive::kPrimBoolean:
f->SetBoolean(o, new_value.z);
break;
- case Class::kPrimByte:
+ case Primitive::kPrimByte:
f->SetByte(o, new_value.b);
break;
- case Class::kPrimChar:
+ case Primitive::kPrimChar:
f->SetChar(o, new_value.c);
break;
- case Class::kPrimDouble:
+ case Primitive::kPrimDouble:
f->SetDouble(o, new_value.d);
break;
- case Class::kPrimFloat:
+ case Primitive::kPrimFloat:
f->SetFloat(o, new_value.f);
break;
- case Class::kPrimInt:
+ case Primitive::kPrimInt:
f->SetInt(o, new_value.i);
break;
- case Class::kPrimLong:
+ case Primitive::kPrimLong:
f->SetLong(o, new_value.j);
break;
- case Class::kPrimShort:
+ case Primitive::kPrimShort:
f->SetShort(o, new_value.s);
break;
- case Class::kPrimNot:
+ case Primitive::kPrimNot:
if (allow_references) {
f->SetObject(o, new_value.l);
break;
}
// Else fall through to report an error.
- case Class::kPrimVoid:
+ case Primitive::kPrimVoid:
// Never okay.
Thread::Current()->ThrowNewExceptionF("Ljava/lang/IllegalArgumentException;",
"Not a primitive field: %s", PrettyField(f).c_str());
@@ -195,7 +196,8 @@
// Widen the value if necessary (and possible).
JValue wide_value;
Class* src_type = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(src_descriptor);
- if (!ConvertPrimitiveValue(src_type, f->GetType(), new_value, wide_value)) {
+ if (!ConvertPrimitiveValue(src_type->GetPrimitiveType(), f->GetPrimitiveType(),
+ new_value, wide_value)) {
return;
}
@@ -282,7 +284,7 @@
if (!GetFieldValue(o, f, value, true)) {
return NULL;
}
- BoxPrimitive(env, f->GetType(), value);
+ BoxPrimitive(env, f->GetPrimitiveType(), value);
return AddLocalReference<jobject>(env, value.l);
}