diff options
author | 2023-10-10 16:10:41 +0100 | |
---|---|---|
committer | 2023-10-16 09:34:34 +0000 | |
commit | 754bdc0a8caf6c05f091afd674759bf7a54a4289 (patch) | |
tree | 1981cae9cbfd94bbf7b9b1dab1d2c240261a423a | |
parent | c8c2953cffe8ff9d2204f4efdff9100eb9fa6df0 (diff) |
Add String.EMPTY
Bug: 303631821
Test: atest CtsLibcoreTestCases:libcore.java.lang.ClassTest
Change-Id: Ide0f4c4f86c3e245284ac7837846aba799362fc5
-rw-r--r-- | runtime/mirror/string-inl.h | 2 | ||||
-rw-r--r-- | runtime/native/java_lang_Class.cc | 15 | ||||
-rw-r--r-- | runtime/well_known_classes.cc | 4 | ||||
-rw-r--r-- | runtime/well_known_classes.h | 1 | ||||
-rw-r--r-- | test/100-reflect2/expected-stdout.txt | 2 |
5 files changed, 15 insertions, 9 deletions
diff --git a/runtime/mirror/string-inl.h b/runtime/mirror/string-inl.h index 0d18b78044..72cd6c051d 100644 --- a/runtime/mirror/string-inl.h +++ b/runtime/mirror/string-inl.h @@ -39,7 +39,7 @@ inline uint32_t String::ClassSize(PointerSize pointer_size) { #else uint32_t vtable_entries = Object::kVTableLength + 72; #endif - return Class::ComputeClassSize(true, vtable_entries, 3, 0, 0, 1, 2, pointer_size); + return Class::ComputeClassSize(true, vtable_entries, 3, 0, 0, 1, 3, pointer_size); } inline uint16_t String::CharAt(int32_t index) { diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index 83736668bb..2abc4935e0 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -685,8 +685,6 @@ static jstring Class_getSimpleNameNative(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<3> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); - MutableHandle<mirror::String> h_name(hs.NewHandle<mirror::String>(nullptr)); - MutableHandle<mirror::String> h_inner_name(hs.NewHandle<mirror::String>(nullptr)); if (klass->IsObsoleteObject()) { ThrowRuntimeException("Obsolete Object!"); return nullptr; @@ -695,11 +693,14 @@ static jstring Class_getSimpleNameNative(JNIEnv* env, jobject javaThis) { ObjPtr<mirror::String> class_name = nullptr; if (annotations::GetInnerClass(klass, &class_name)) { if (class_name == nullptr) { // Anonymous class - gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); - return soa.AddLocalReference<jstring>( - mirror::String::AllocEmptyString(soa.Self(), allocator_type)); + ObjPtr<mirror::Class> j_l_String = + WellKnownClasses::java_lang_String_EMPTY->GetDeclaringClass(); + ObjPtr<mirror::Object> empty_string = + WellKnownClasses::java_lang_String_EMPTY->GetObject(j_l_String); + DCHECK(empty_string != nullptr); + return soa.AddLocalReference<jstring>(empty_string); } - h_inner_name.Assign(class_name); + Handle<mirror::String> h_inner_name(hs.NewHandle<mirror::String>(class_name)); if (annotations::GetDeclaringClass(klass) != nullptr || // member class annotations::GetEnclosingMethod(klass) != nullptr) { // local class return soa.AddLocalReference<jstring>(h_inner_name.Get()); @@ -707,7 +708,7 @@ static jstring Class_getSimpleNameNative(JNIEnv* env, jobject javaThis) { } } - h_name.Assign(mirror::Class::ComputeName(klass)); + Handle<mirror::String> h_name(hs.NewHandle<mirror::String>(mirror::Class::ComputeName(klass))); if (h_name == nullptr) { return nullptr; } diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc index 780fa830b8..cdc254ab8a 100644 --- a/runtime/well_known_classes.cc +++ b/runtime/well_known_classes.cc @@ -124,6 +124,7 @@ ArtField* WellKnownClasses::dalvik_system_DexPathList__Element_dexFile; ArtField* WellKnownClasses::dalvik_system_VMRuntime_nonSdkApiUsageConsumer; ArtField* WellKnownClasses::java_io_FileDescriptor_descriptor; ArtField* WellKnownClasses::java_lang_ClassLoader_parent; +ArtField* WellKnownClasses::java_lang_String_EMPTY; ArtField* WellKnownClasses::java_lang_Thread_parkBlocker; ArtField* WellKnownClasses::java_lang_Thread_daemon; ArtField* WellKnownClasses::java_lang_Thread_group; @@ -686,6 +687,8 @@ void WellKnownClasses::InitFieldsAndMethodsOnly(JNIEnv* env) { java_lang_ClassLoader_parent = CacheField( j_l_cl.Get(), /*is_static=*/ false, "parent", "Ljava/lang/ClassLoader;"); + java_lang_String_EMPTY = + CacheField(j_l_String, /*is_static=*/true, "EMPTY", "Ljava/lang/String;"); java_lang_Thread_parkBlocker = CacheField(j_l_Thread.Get(), /*is_static=*/ false, "parkBlocker", "Ljava/lang/Object;"); java_lang_Thread_daemon = CacheField(j_l_Thread.Get(), /*is_static=*/ false, "daemon", "Z"); @@ -871,6 +874,7 @@ void WellKnownClasses::Clear() { dalvik_system_DexPathList__Element_dexFile = nullptr; dalvik_system_VMRuntime_nonSdkApiUsageConsumer = nullptr; java_lang_ClassLoader_parent = nullptr; + java_lang_String_EMPTY = nullptr; java_lang_Thread_parkBlocker = nullptr; java_lang_Thread_daemon = nullptr; java_lang_Thread_group = nullptr; diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h index cc6347cd5e..444f9e139f 100644 --- a/runtime/well_known_classes.h +++ b/runtime/well_known_classes.h @@ -169,6 +169,7 @@ struct WellKnownClasses { static ArtField* dalvik_system_VMRuntime_nonSdkApiUsageConsumer; static ArtField* java_io_FileDescriptor_descriptor; static ArtField* java_lang_ClassLoader_parent; + static ArtField* java_lang_String_EMPTY; static ArtField* java_lang_Thread_parkBlocker; static ArtField* java_lang_Thread_daemon; static ArtField* java_lang_Thread_group; diff --git a/test/100-reflect2/expected-stdout.txt b/test/100-reflect2/expected-stdout.txt index bd55aa921c..d152468a4b 100644 --- a/test/100-reflect2/expected-stdout.txt +++ b/test/100-reflect2/expected-stdout.txt @@ -32,7 +32,7 @@ z (class java.lang.Character) 62 (class java.lang.Long) 14 (class java.lang.Short) [java.lang.String(byte[],byte), java.lang.String(int,int,char[]), public java.lang.String(), public java.lang.String(byte[]), public java.lang.String(byte[],int), public java.lang.String(byte[],int,int), public java.lang.String(byte[],int,int,int), public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException, public java.lang.String(byte[],int,int,java.nio.charset.Charset), public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException, public java.lang.String(byte[],java.nio.charset.Charset), public java.lang.String(char[]), public java.lang.String(char[],int,int), public java.lang.String(int[],int,int), public java.lang.String(java.lang.String), public java.lang.String(java.lang.StringBuffer), public java.lang.String(java.lang.StringBuilder)] -[private final int java.lang.String.count, private int java.lang.String.hash, private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields, private static final long java.lang.String.serialVersionUID, public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER, static final boolean java.lang.String.COMPACT_STRINGS, static final byte java.lang.String.LATIN1, static final byte java.lang.String.UTF16] +[private final int java.lang.String.count, private int java.lang.String.hash, private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields, private static final long java.lang.String.serialVersionUID, public static final java.lang.String java.lang.String.EMPTY, public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER, static final boolean java.lang.String.COMPACT_STRINGS, static final byte java.lang.String.LATIN1, static final byte java.lang.String.UTF16] [byte java.lang.String.coder(), native void java.lang.String.getCharsNoCheck(int,int,char[],int), private boolean java.lang.String.nonSyncContentEquals(java.lang.AbstractStringBuilder), private int java.lang.String.indexOfNonWhitespace(), private int java.lang.String.indexOfSupplementary(int,int), private int java.lang.String.lastIndexOfNonWhitespace(), private int java.lang.String.lastIndexOfSupplementary(int,int), private native java.lang.String java.lang.String.doRepeat(int), private native java.lang.String java.lang.String.doReplace(char,char), private native java.lang.String java.lang.String.fastSubstring(int,int), private native void java.lang.String.fillBytesLatin1(byte[],int), private native void java.lang.String.fillBytesUTF16(byte[],int), private static int java.lang.String.indexOf(java.lang.String,java.lang.String,int), private static int java.lang.String.lastIndexOf(java.lang.String,java.lang.String,int), private static int java.lang.String.outdent(java.util.List), public boolean java.lang.String.contains(java.lang.CharSequence), public boolean java.lang.String.contentEquals(java.lang.CharSequence), public boolean java.lang.String.contentEquals(java.lang.StringBuffer), public boolean java.lang.String.endsWith(java.lang.String), public boolean java.lang.String.equals(java.lang.Object), public boolean java.lang.String.equalsIgnoreCase(java.lang.String), public boolean java.lang.String.isBlank(), public boolean java.lang.String.isEmpty(), public boolean java.lang.String.matches(java.lang.String), public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int), public boolean java.lang.String.regionMatches(int,java.lang.String,int,int), public boolean java.lang.String.startsWith(java.lang.String), public boolean java.lang.String.startsWith(java.lang.String,int), public byte[] java.lang.String.getBytes(), public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException, public byte[] java.lang.String.getBytes(java.nio.charset.Charset), public int java.lang.String.codePointAt(int), public int java.lang.String.codePointBefore(int), public int java.lang.String.codePointCount(int,int), public int java.lang.String.compareTo(java.lang.Object), public int java.lang.String.compareToIgnoreCase(java.lang.String), public int java.lang.String.hashCode(), public int java.lang.String.indexOf(int), public int java.lang.String.indexOf(int,int), public int java.lang.String.indexOf(java.lang.String), public int java.lang.String.indexOf(java.lang.String,int), public int java.lang.String.lastIndexOf(int), public int java.lang.String.lastIndexOf(int,int), public int java.lang.String.lastIndexOf(java.lang.String), public int java.lang.String.lastIndexOf(java.lang.String,int), public int java.lang.String.length(), public int java.lang.String.offsetByCodePoints(int,int), public java.lang.CharSequence java.lang.String.subSequence(int,int), public java.lang.Object java.lang.String.resolveConstantDesc(java.lang.invoke.MethodHandles$Lookup) throws java.lang.ReflectiveOperationException, public java.lang.Object java.lang.String.transform(java.util.function.Function), public java.lang.String java.lang.String.formatted(java.lang.Object[]), public java.lang.String java.lang.String.indent(int), public java.lang.String java.lang.String.repeat(int), public java.lang.String java.lang.String.replace(char,char), public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence), public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String), public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String), public java.lang.String java.lang.String.resolveConstantDesc(java.lang.invoke.MethodHandles$Lookup), public java.lang.String java.lang.String.strip(), public java.lang.String java.lang.String.stripIndent(), public java.lang.String java.lang.String.stripLeading(), public java.lang.String java.lang.String.stripTrailing(), public java.lang.String java.lang.String.substring(int), public java.lang.String java.lang.String.substring(int,int), public java.lang.String java.lang.String.toLowerCase(), public java.lang.String java.lang.String.toLowerCase(java.util.Locale), public java.lang.String java.lang.String.toString(), public java.lang.String java.lang.String.toUpperCase(), public java.lang.String java.lang.String.toUpperCase(java.util.Locale), public java.lang.String java.lang.String.translateEscapes(), public java.lang.String java.lang.String.trim(), public java.lang.String[] java.lang.String.split(java.lang.String), public java.lang.String[] java.lang.String.split(java.lang.String,int), public java.util.Optional java.lang.String.describeConstable(), public java.util.stream.IntStream java.lang.String.chars(), public java.util.stream.IntStream java.lang.String.codePoints(), public java.util.stream.Stream java.lang.String.lines(), public native char java.lang.String.charAt(int), public native char[] java.lang.String.toCharArray(), public native int java.lang.String.compareTo(java.lang.String), public native java.lang.String java.lang.String.concat(java.lang.String), public native java.lang.String java.lang.String.intern(), public static java.lang.String java.lang.String.copyValueOf(char[]), public static java.lang.String java.lang.String.copyValueOf(char[],int,int), public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[]), public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[]), public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.CharSequence[]), public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.Iterable), public static java.lang.String java.lang.String.valueOf(boolean), public static java.lang.String java.lang.String.valueOf(char), public static java.lang.String java.lang.String.valueOf(char[]), public static java.lang.String java.lang.String.valueOf(char[],int,int), public static java.lang.String java.lang.String.valueOf(double), public static java.lang.String java.lang.String.valueOf(float), public static java.lang.String java.lang.String.valueOf(int), public static java.lang.String java.lang.String.valueOf(java.lang.Object), public static java.lang.String java.lang.String.valueOf(long), public void java.lang.String.getBytes(int,int,byte[],int), public void java.lang.String.getChars(int,int,char[],int), static int java.lang.String.indexOf(byte[],byte,int,java.lang.String,int), static int java.lang.String.lastIndexOf(byte[],byte,int,java.lang.String,int), static int java.lang.String.lastIndexOf(char[],int,int,char[],int,int,int), static java.lang.String java.lang.String.lambda$indent$0(java.lang.String,java.lang.String), static java.lang.String java.lang.String.lambda$indent$1(java.lang.String), static java.lang.String java.lang.String.lambda$indent$2(int,java.lang.String), static java.lang.String java.lang.String.lambda$stripIndent$3(int,java.lang.String), static java.lang.String java.lang.String.valueOfCodePoint(int), static void java.lang.String.checkBoundsBeginEnd(int,int,int), static void java.lang.String.checkBoundsOffCount(int,int,int), static void java.lang.String.checkIndex(int,int), static void java.lang.String.checkOffset(int,int), void java.lang.String.getBytes(byte[],int,byte), void java.lang.String.getChars(char[],int)] [] [interface java.io.Serializable, interface java.lang.Comparable, interface java.lang.CharSequence, interface java.lang.constant.Constable, interface java.lang.constant.ConstantDesc] |