diff options
author | 2024-12-11 14:19:39 +0000 | |
---|---|---|
committer | 2024-12-11 09:36:04 -0800 | |
commit | 7e780be3358210ff21ddd60cb3ed0acedb27cb03 (patch) | |
tree | 7e2944c0f2048729029da5bbab13d439fb62e6ed | |
parent | 5c6e77ec9955bb675567f31252dc40535d92462e (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.cc | 21 | ||||
-rw-r--r-- | runtime/well_known_classes.cc | 9 | ||||
-rw-r--r-- | runtime/well_known_classes.h | 3 |
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; |