diff -r fec876499aae -r e79347eebbc5 hotspot/src/share/vm/ci/ciInstanceKlass.cpp --- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Sat Sep 10 00:11:04 2011 -0700 +++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Sat Sep 10 17:29:02 2011 -0700 @@ -31,6 +31,7 @@ #include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" #include "oops/oop.inline.hpp" +#include "oops/fieldStreams.hpp" #include "runtime/fieldDescriptor.hpp" // ciInstanceKlass @@ -412,7 +413,7 @@ VM_ENTRY_MARK; ciEnv* curEnv = ciEnv::current(); instanceKlass* ik = get_instanceKlass(); - int max_n_fields = ik->fields()->length()/instanceKlass::next_offset; + int max_n_fields = ik->java_fields_count(); Arena* arena = curEnv->arena(); _non_static_fields = @@ -476,23 +477,6 @@ // Now sort them by offset, ascending. // (In principle, they could mix with superclass fields.) fields->sort(sort_field_by_offset); -#ifdef ASSERT - int last_offset = instanceOopDesc::base_offset_in_bytes(); - for (int i = 0; i < fields->length(); i++) { - ciField* field = fields->at(i); - int offset = field->offset_in_bytes(); - int size = (field->_type == NULL) ? heapOopSize : field->size_in_bytes(); - assert(last_offset <= offset, err_msg("no field overlap: %d <= %d", last_offset, offset)); - if (last_offset > (int)sizeof(oopDesc)) - assert((offset - last_offset) < BytesPerLong, "no big holes"); - // Note: Two consecutive T_BYTE fields will be separated by wordSize-1 - // padding bytes if one of them is declared by a superclass. - // This is a minor inefficiency classFileParser.cpp. - last_offset = offset + size; - } - assert(last_offset <= (int)instanceOopDesc::base_offset_in_bytes() + fsize, "no overflow"); -#endif - _nonstatic_fields = fields; return flen; } @@ -505,33 +489,29 @@ int flen = 0; GrowableArray* fields = NULL; instanceKlass* k = get_instanceKlass(); - typeArrayOop fields_array = k->fields(); - for (int pass = 0; pass <= 1; pass++) { - for (int i = 0, alen = fields_array->length(); i < alen; i += instanceKlass::next_offset) { - fieldDescriptor fd; - fd.initialize(k->as_klassOop(), i); - if (fd.is_static()) continue; - if (pass == 0) { - flen += 1; - } else { - ciField* field = new (arena) ciField(&fd); - fields->append(field); - } - } + for (JavaFieldStream fs(k); !fs.done(); fs.next()) { + if (fs.access_flags().is_static()) continue; + flen += 1; + } - // Between passes, allocate the array: - if (pass == 0) { - if (flen == 0) { - return NULL; // return nothing if none are locally declared - } - if (super_fields != NULL) { - flen += super_fields->length(); - } - fields = new (arena) GrowableArray(arena, flen, 0, NULL); - if (super_fields != NULL) { - fields->appendAll(super_fields); - } - } + // allocate the array: + if (flen == 0) { + return NULL; // return nothing if none are locally declared + } + if (super_fields != NULL) { + flen += super_fields->length(); + } + fields = new (arena) GrowableArray(arena, flen, 0, NULL); + if (super_fields != NULL) { + fields->appendAll(super_fields); + } + + for (JavaFieldStream fs(k); !fs.done(); fs.next()) { + if (fs.access_flags().is_static()) continue; + fieldDescriptor fd; + fd.initialize(k->as_klassOop(), fs.index()); + ciField* field = new (arena) ciField(&fd); + fields->append(field); } assert(fields->length() == flen, "sanity"); return fields;