1.1 --- a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Sat Sep 10 00:11:04 2011 -0700 1.2 +++ b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Sat Sep 10 17:29:02 2011 -0700 1.3 @@ -25,6 +25,7 @@ 1.4 #include "precompiled.hpp" 1.5 #include "classfile/symbolTable.hpp" 1.6 #include "interpreter/bytecodeStream.hpp" 1.7 +#include "oops/fieldStreams.hpp" 1.8 #include "prims/jvmtiClassFileReconstituter.hpp" 1.9 #include "runtime/signature.hpp" 1.10 #ifdef TARGET_ARCH_x86 1.11 @@ -52,25 +53,22 @@ 1.12 // JVMSpec| field_info fields[fields_count]; 1.13 void JvmtiClassFileReconstituter::write_field_infos() { 1.14 HandleMark hm(thread()); 1.15 - typeArrayHandle fields(thread(), ikh()->fields()); 1.16 - int fields_length = fields->length(); 1.17 - int num_fields = fields_length / instanceKlass::next_offset; 1.18 objArrayHandle fields_anno(thread(), ikh()->fields_annotations()); 1.19 1.20 - write_u2(num_fields); 1.21 - for (int index = 0; index < fields_length; index += instanceKlass::next_offset) { 1.22 - AccessFlags access_flags; 1.23 - int flags = fields->ushort_at(index + instanceKlass::access_flags_offset); 1.24 - access_flags.set_flags(flags); 1.25 - int name_index = fields->ushort_at(index + instanceKlass::name_index_offset); 1.26 - int signature_index = fields->ushort_at(index + instanceKlass::signature_index_offset); 1.27 - int initial_value_index = fields->ushort_at(index + instanceKlass::initval_index_offset); 1.28 + // Compute the real number of Java fields 1.29 + int java_fields = ikh()->java_fields_count(); 1.30 + 1.31 + write_u2(java_fields * FieldInfo::field_slots); 1.32 + for (JavaFieldStream fs(ikh()); !fs.done(); fs.next()) { 1.33 + AccessFlags access_flags = fs.access_flags(); 1.34 + int name_index = fs.name_index(); 1.35 + int signature_index = fs.signature_index(); 1.36 + int initial_value_index = fs.initval_index(); 1.37 guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field"); 1.38 - int offset = ikh()->offset_from_fields( index ); 1.39 - int generic_signature_index = 1.40 - fields->ushort_at(index + instanceKlass::generic_signature_offset); 1.41 + // int offset = ikh()->field_offset( index ); 1.42 + int generic_signature_index = fs.generic_signature_index(); 1.43 typeArrayHandle anno(thread(), fields_anno.not_null() ? 1.44 - (typeArrayOop)(fields_anno->obj_at(index / instanceKlass::next_offset)) : 1.45 + (typeArrayOop)(fields_anno->obj_at(fs.index())) : 1.46 (typeArrayOop)NULL); 1.47 1.48 // JVMSpec| field_info { 1.49 @@ -81,7 +79,7 @@ 1.50 // JVMSpec| attribute_info attributes[attributes_count]; 1.51 // JVMSpec| } 1.52 1.53 - write_u2(flags & JVM_RECOGNIZED_FIELD_MODIFIERS); 1.54 + write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS); 1.55 write_u2(name_index); 1.56 write_u2(signature_index); 1.57 int attr_count = 0;