src/share/vm/prims/jvmtiClassFileReconstituter.cpp

changeset 3137
e6b1331a51d2
parent 2708
1d1603768966
child 3143
35c656d0b685
     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;

mercurial