summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2024-12-11 14:19:39 +0000
committer Nicolas Geoffray <ngeoffray@google.com> 2024-12-11 09:36:04 -0800
commit7e780be3358210ff21ddd60cb3ed0acedb27cb03 (patch)
tree7e2944c0f2048729029da5bbab13d439fb62e6ed
parent5c6e77ec9955bb675567f31252dc40535d92462e (diff)
Add more WellKnownClasses fields for boxing/unboxing.
In preparation for merging iFields and sFields. Test: test.py Change-Id: I5e5f1b94693feacd54ad351acbb4f26024031b55
-rw-r--r--runtime/reflection.cc21
-rw-r--r--runtime/well_known_classes.cc9
-rw-r--r--runtime/well_known_classes.h3
3 files changed, 22 insertions, 11 deletions
diff --git a/runtime/reflection.cc b/runtime/reflection.cc
index 8ebbeddcb1..c6dcf59ca1 100644
--- a/runtime/reflection.cc
+++ b/runtime/reflection.cc
@@ -262,13 +262,13 @@ class ArgArray {
#define DO_FIRST_ARG(boxed, get_fn, append) { \
if (LIKELY(arg != nullptr && \
arg->GetClass() == WellKnownClasses::java_lang_##boxed)) { \
- ArtField* primitive_field = arg->GetClass()->GetInstanceField(0); \
+ ArtField* primitive_field = WellKnownClasses::java_lang_##boxed##_value; \
append(primitive_field-> get_fn(arg.Get()));
#define DO_ARG(boxed, get_fn, append) \
} else if (LIKELY(arg != nullptr && \
arg->GetClass() == WellKnownClasses::java_lang_##boxed)) { \
- ArtField* primitive_field = arg->GetClass()->GetInstanceField(0); \
+ ArtField* primitive_field = WellKnownClasses::java_lang_##boxed##_value; \
append(primitive_field-> get_fn(arg.Get()));
#define DO_FAIL(expected) \
@@ -952,31 +952,30 @@ static bool UnboxPrimitive(ObjPtr<mirror::Object> o,
JValue boxed_value;
ObjPtr<mirror::Class> klass = o->GetClass();
Primitive::Type primitive_type;
- ArtField* primitive_field = &klass->GetIFieldsPtr()->At(0);
if (klass == WellKnownClasses::java_lang_Boolean) {
primitive_type = Primitive::kPrimBoolean;
- boxed_value.SetZ(primitive_field->GetBoolean(o));
+ boxed_value.SetZ(WellKnownClasses::java_lang_Boolean_value->GetBoolean(o));
} else if (klass == WellKnownClasses::java_lang_Byte) {
primitive_type = Primitive::kPrimByte;
- boxed_value.SetB(primitive_field->GetByte(o));
+ boxed_value.SetB(WellKnownClasses::java_lang_Byte_value->GetByte(o));
} else if (klass == WellKnownClasses::java_lang_Character) {
primitive_type = Primitive::kPrimChar;
- boxed_value.SetC(primitive_field->GetChar(o));
+ boxed_value.SetC(WellKnownClasses::java_lang_Character_value->GetChar(o));
} else if (klass == WellKnownClasses::java_lang_Float) {
primitive_type = Primitive::kPrimFloat;
- boxed_value.SetF(primitive_field->GetFloat(o));
+ boxed_value.SetF(WellKnownClasses::java_lang_Float_value->GetFloat(o));
} else if (klass == WellKnownClasses::java_lang_Double) {
primitive_type = Primitive::kPrimDouble;
- boxed_value.SetD(primitive_field->GetDouble(o));
+ boxed_value.SetD(WellKnownClasses::java_lang_Double_value->GetDouble(o));
} else if (klass == WellKnownClasses::java_lang_Integer) {
primitive_type = Primitive::kPrimInt;
- boxed_value.SetI(primitive_field->GetInt(o));
+ boxed_value.SetI(WellKnownClasses::java_lang_Integer_value->GetInt(o));
} else if (klass == WellKnownClasses::java_lang_Long) {
primitive_type = Primitive::kPrimLong;
- boxed_value.SetJ(primitive_field->GetLong(o));
+ boxed_value.SetJ(WellKnownClasses::java_lang_Long_value->GetLong(o));
} else if (klass == WellKnownClasses::java_lang_Short) {
primitive_type = Primitive::kPrimShort;
- boxed_value.SetS(primitive_field->GetShort(o));
+ boxed_value.SetS(WellKnownClasses::java_lang_Short_value->GetShort(o));
} else {
std::string temp;
ThrowIllegalArgumentException(
diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc
index 5c1d9e9da0..8fff1ba33c 100644
--- a/runtime/well_known_classes.cc
+++ b/runtime/well_known_classes.cc
@@ -172,6 +172,9 @@ ArtField* WellKnownClasses::java_lang_Short_ShortCache_cache;
ArtField* WellKnownClasses::java_lang_Integer_IntegerCache_cache;
ArtField* WellKnownClasses::java_lang_Long_LongCache_cache;
+ArtField* WellKnownClasses::java_lang_Boolean_value;
+ArtField* WellKnownClasses::java_lang_Float_value;
+ArtField* WellKnownClasses::java_lang_Double_value;
ArtField* WellKnownClasses::java_lang_Byte_value;
ArtField* WellKnownClasses::java_lang_Character_value;
ArtField* WellKnownClasses::java_lang_Short_value;
@@ -407,6 +410,12 @@ void WellKnownClasses::InitFieldsAndMethodsOnly(JNIEnv* env) {
java_lang_Long_LongCache_cache = CacheBoxingCacheField(
class_linker, self, "Ljava/lang/Long$LongCache;", "[Ljava/lang/Long;");
+ java_lang_Boolean_value = CacheValueInBoxField(
+ class_linker, self, "Ljava/lang/Boolean;", "Z");
+ java_lang_Float_value = CacheValueInBoxField(
+ class_linker, self, "Ljava/lang/Float;", "F");
+ java_lang_Double_value = CacheValueInBoxField(
+ class_linker, self, "Ljava/lang/Double;", "D");
java_lang_Byte_value = CacheValueInBoxField(
class_linker, self, "Ljava/lang/Byte;", "B");
java_lang_Character_value = CacheValueInBoxField(
diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h
index 6d5c9781ef..6f5473e89e 100644
--- a/runtime/well_known_classes.h
+++ b/runtime/well_known_classes.h
@@ -218,6 +218,9 @@ struct EXPORT WellKnownClasses {
static ArtField* java_lang_Integer_IntegerCache_cache;
static ArtField* java_lang_Long_LongCache_cache;
+ static ArtField* java_lang_Boolean_value;
+ static ArtField* java_lang_Float_value;
+ static ArtField* java_lang_Double_value;
static ArtField* java_lang_Byte_value;
static ArtField* java_lang_Character_value;
static ArtField* java_lang_Short_value;