diff --git a/src/hotspot/share/oops/fieldStreams.hpp b/src/hotspot/share/oops/fieldStreams.hpp index 54619f4d472..9a98a2bd223 100644 --- a/src/hotspot/share/oops/fieldStreams.hpp +++ b/src/hotspot/share/oops/fieldStreams.hpp @@ -120,7 +120,7 @@ class FieldStreamBase : public StackObj { // Convenient methods - FieldInfo to_FieldInfo() { + const FieldInfo& to_FieldInfo() const { return _fi_buf; } @@ -131,7 +131,7 @@ class FieldStreamBase : public StackObj { // bridge to a heavier API: fieldDescriptor& field_descriptor() const { fieldDescriptor& field = const_cast(_fd_buf); - field.reinitialize(field_holder(), _index); + field.reinitialize(field_holder(), to_FieldInfo()); return field; } }; diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index b924af34cb3..13500f50718 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -1649,7 +1649,7 @@ bool InstanceKlass::find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* Symbol* f_name = fs.name(); Symbol* f_sig = fs.signature(); if (f_name == name && f_sig == sig) { - fd->reinitialize(const_cast(this), fs.index()); + fd->reinitialize(const_cast(this), fs.to_FieldInfo()); return true; } } @@ -1718,7 +1718,7 @@ Klass* InstanceKlass::find_field(Symbol* name, Symbol* sig, bool is_static, fiel bool InstanceKlass::find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const { for (JavaFieldStream fs(this); !fs.done(); fs.next()) { if (fs.offset() == offset) { - fd->reinitialize(const_cast(this), fs.index()); + fd->reinitialize(const_cast(this), fs.to_FieldInfo()); if (fd->is_static() == is_static) return true; } } @@ -1779,19 +1779,16 @@ void InstanceKlass::do_nonstatic_fields(FieldClosure* cl) { if (super != nullptr) { super->do_nonstatic_fields(cl); } - fieldDescriptor fd; - int length = java_fields_count(); - for (int i = 0; i < length; i += 1) { - fd.reinitialize(this, i); + for (JavaFieldStream fs(this); !fs.done(); fs.next()) { + fieldDescriptor& fd = fs.field_descriptor(); if (!fd.is_static()) { cl->do_field(&fd); } } } -// first in Pair is offset, second is index. -static int compare_fields_by_offset(Pair* a, Pair* b) { - return a->first - b->first; +static int compare_fields_by_offset(FieldInfo* a, FieldInfo* b) { + return a->offset() - b->offset(); } void InstanceKlass::print_nonstatic_fields(FieldClosure* cl) { @@ -1800,26 +1797,20 @@ void InstanceKlass::print_nonstatic_fields(FieldClosure* cl) { super->print_nonstatic_fields(cl); } ResourceMark rm; - fieldDescriptor fd; // In DebugInfo nonstatic fields are sorted by offset. - GrowableArray > fields_sorted; - int i = 0; + GrowableArray fields_sorted; for (AllFieldStream fs(this); !fs.done(); fs.next()) { if (!fs.access_flags().is_static()) { - fd = fs.field_descriptor(); - Pair f(fs.offset(), fs.index()); - fields_sorted.push(f); - i++; + fields_sorted.push(fs.to_FieldInfo()); } } - if (i > 0) { - int length = i; - assert(length == fields_sorted.length(), "duh"); - // _sort_Fn is defined in growableArray.hpp. + int length = fields_sorted.length(); + if (length > 0) { fields_sorted.sort(compare_fields_by_offset); + fieldDescriptor fd; for (int i = 0; i < length; i++) { - fd.reinitialize(this, fields_sorted.at(i).second); - assert(!fd.is_static() && fd.offset() == fields_sorted.at(i).first, "only nonstatic fields"); + fd.reinitialize(this, fields_sorted.at(i)); + assert(!fd.is_static() && fd.offset() == checked_cast(fields_sorted.at(i).offset()), "only nonstatic fields"); cl->do_field(&fd); } } diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index 08fc2b49cc5..fe08ba178a5 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -134,6 +134,7 @@ class InstanceKlass: public Klass { friend class JVMCIVMStructs; friend class ClassFileParser; friend class CompileReplay; + friend class FieldStream; public: static const KlassKind Kind = InstanceKlassKind; diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 64bed35d08f..c180e720371 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -1787,7 +1787,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, fieldDescriptor fd; for (JavaFieldStream fs(k); !fs.done(); fs.next()) { if (!publicOnly || fs.access_flags().is_public()) { - fd.reinitialize(k, fs.index()); + fd.reinitialize(k, fs.to_FieldInfo()); oop field = Reflection::new_field(&fd, CHECK_NULL); result->obj_at_put(out_idx, field); ++out_idx; diff --git a/src/hotspot/share/runtime/fieldDescriptor.cpp b/src/hotspot/share/runtime/fieldDescriptor.cpp index d326b79acfd..2b4a91c0cc8 100644 --- a/src/hotspot/share/runtime/fieldDescriptor.cpp +++ b/src/hotspot/share/runtime/fieldDescriptor.cpp @@ -87,7 +87,7 @@ oop fieldDescriptor::string_initial_value(TRAPS) const { return constants()->uncached_string_at(initial_value_index(), THREAD); } -void fieldDescriptor::reinitialize(InstanceKlass* ik, int index) { +void fieldDescriptor::reinitialize(InstanceKlass* ik, const FieldInfo& fieldinfo) { if (_cp.is_null() || field_holder() != ik) { _cp = constantPoolHandle(Thread::current(), ik->constants()); // _cp should now reference ik's constant pool; i.e., ik is now field_holder. @@ -95,8 +95,7 @@ void fieldDescriptor::reinitialize(InstanceKlass* ik, int index) { // but that's ok because of constant pool merging. assert(field_holder() == ik || ik->is_scratch_class(), "must be already initialized to this class"); } - _fieldinfo= ik->field(index); - assert((int)_fieldinfo.index() == index, "just checking"); + _fieldinfo = fieldinfo; guarantee(_fieldinfo.name_index() != 0 && _fieldinfo.signature_index() != 0, "bad constant pool index for fieldDescriptor"); } diff --git a/src/hotspot/share/runtime/fieldDescriptor.hpp b/src/hotspot/share/runtime/fieldDescriptor.hpp index 1f7fdbe390a..660033f31d5 100644 --- a/src/hotspot/share/runtime/fieldDescriptor.hpp +++ b/src/hotspot/share/runtime/fieldDescriptor.hpp @@ -46,7 +46,7 @@ class fieldDescriptor { public: fieldDescriptor() {} fieldDescriptor(InstanceKlass* ik, int index) { - reinitialize(ik, index); + reinitialize(ik, ik->field(index)); } inline Symbol* name() const; inline Symbol* signature() const; @@ -102,7 +102,7 @@ class fieldDescriptor { inline void set_has_initialized_final_update(const bool value); // Initialization - void reinitialize(InstanceKlass* ik, int index); + void reinitialize(InstanceKlass* ik, const FieldInfo& fieldinfo); // Print void print() const; diff --git a/src/hotspot/share/runtime/reflectionUtils.hpp b/src/hotspot/share/runtime/reflectionUtils.hpp index 04ff68c4271..b074f5460a5 100644 --- a/src/hotspot/share/runtime/reflectionUtils.hpp +++ b/src/hotspot/share/runtime/reflectionUtils.hpp @@ -152,7 +152,7 @@ class FieldStream : public KlassStream { // bridge to a heavier API: fieldDescriptor& field_descriptor() const { fieldDescriptor& field = const_cast(_fd_buf); - field.reinitialize(_klass, _index); + field.reinitialize(_klass, _klass->field(_index)); return field; } };