# HG changeset patch # User jiangli # Date 1340388039 14400 # Node ID 67539edd246d59d2c4aa6299fd0e847261edbf5f # Parent a97a0bd28c2ec6f872be76e2b4842b9e924430d4 7177409: Perf regression in JVM_GetClassDeclaredFields after generic signature changes. Summary: In fieldDescriptor::generic_signature() returns NULL immediately if the field has no generic signature. Reviewed-by: dholmes, coleenp, jcoomes diff -r a97a0bd28c2e -r 67539edd246d hotspot/src/share/vm/runtime/fieldDescriptor.cpp --- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Tue Jun 19 21:16:20 2012 -0700 +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Fri Jun 22 14:00:39 2012 -0400 @@ -39,6 +39,10 @@ } Symbol* fieldDescriptor::generic_signature() const { + if (!has_generic_signature()) { + return NULL; + } + int idx = 0; instanceKlass* ik = instanceKlass::cast(field_holder()); for (AllFieldStream fs(ik); !fs.done(); fs.next()) { diff -r a97a0bd28c2e -r 67539edd246d hotspot/src/share/vm/runtime/fieldDescriptor.hpp --- a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp Tue Jun 19 21:16:20 2012 -0700 +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp Fri Jun 22 14:00:39 2012 -0400 @@ -100,6 +100,7 @@ bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } bool is_field_modification_watched() const { return access_flags().is_field_modification_watched(); } + bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } void set_is_field_access_watched(const bool value) { _access_flags.set_is_field_access_watched(value); diff -r a97a0bd28c2e -r 67539edd246d hotspot/src/share/vm/runtime/reflection.cpp --- a/hotspot/src/share/vm/runtime/reflection.cpp Tue Jun 19 21:16:20 2012 -0700 +++ b/hotspot/src/share/vm/runtime/reflection.cpp Fri Jun 22 14:00:39 2012 -0400 @@ -829,7 +829,7 @@ java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS); java_lang_reflect_Field::set_override(rh(), false); if (java_lang_reflect_Field::has_signature_field() && - fd->generic_signature() != NULL) { + fd->has_generic_signature()) { Symbol* gs = fd->generic_signature(); Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL); java_lang_reflect_Field::set_signature(rh(), sig());