--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Sat Sep 10 00:11:04 2011 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Sat Sep 10 17:29:02 2011 -0700
@@ -36,6 +36,7 @@
#include "memory/genOopClosures.inline.hpp"
#include "memory/oopFactory.hpp"
#include "memory/permGen.hpp"
+#include "oops/fieldStreams.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/instanceMirrorKlass.hpp"
#include "oops/instanceOop.hpp"
@@ -782,14 +783,11 @@
bool instanceKlass::find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {
- const int n = fields()->length();
- for (int i = 0; i < n; i += next_offset ) {
- int name_index = fields()->ushort_at(i + name_index_offset);
- int sig_index = fields()->ushort_at(i + signature_index_offset);
- Symbol* f_name = constants()->symbol_at(name_index);
- Symbol* f_sig = constants()->symbol_at(sig_index);
+ for (JavaFieldStream fs(as_klassOop()); !fs.done(); fs.next()) {
+ Symbol* f_name = fs.name();
+ Symbol* f_sig = fs.signature();
if (f_name == name && f_sig == sig) {
- fd->initialize(as_klassOop(), i);
+ fd->initialize(as_klassOop(), fs.index());
return true;
}
}
@@ -803,11 +801,10 @@
closure->do_symbol(&_source_file_name);
closure->do_symbol(&_source_debug_extension);
- const int n = fields()->length();
- for (int i = 0; i < n; i += next_offset ) {
- int name_index = fields()->ushort_at(i + name_index_offset);
+ for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
+ int name_index = fs.name_index();
closure->do_symbol(constants()->symbol_at_addr(name_index));
- int sig_index = fields()->ushort_at(i + signature_index_offset);
+ int sig_index = fs.signature_index();
closure->do_symbol(constants()->symbol_at_addr(sig_index));
}
}
@@ -872,10 +869,9 @@
bool instanceKlass::find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const {
- int length = fields()->length();
- for (int i = 0; i < length; i += next_offset) {
- if (offset_from_fields( i ) == offset) {
- fd->initialize(as_klassOop(), i);
+ for (JavaFieldStream fs(as_klassOop()); !fs.done(); fs.next()) {
+ if (fs.offset() == offset) {
+ fd->initialize(as_klassOop(), fs.index());
if (fd->is_static() == is_static) return true;
}
}
@@ -906,11 +902,12 @@
void instanceKlass::do_local_static_fields(FieldClosure* cl) {
- fieldDescriptor fd;
- int length = fields()->length();
- for (int i = 0; i < length; i += next_offset) {
- fd.initialize(as_klassOop(), i);
- if (fd.is_static()) cl->do_field(&fd);
+ for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
+ if (fs.access_flags().is_static()) {
+ fieldDescriptor fd;
+ fd.initialize(as_klassOop(), fs.index());
+ cl->do_field(&fd);
+ }
}
}
@@ -922,11 +919,12 @@
void instanceKlass::do_local_static_fields_impl(instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS) {
- fieldDescriptor fd;
- int length = this_oop->fields()->length();
- for (int i = 0; i < length; i += next_offset) {
- fd.initialize(this_oop(), i);
- if (fd.is_static()) { f(&fd, CHECK); } // Do NOT remove {}! (CHECK macro expands into several statements)
+ for (JavaFieldStream fs(this_oop()); !fs.done(); fs.next()) {
+ if (fs.access_flags().is_static()) {
+ fieldDescriptor fd;
+ fd.initialize(this_oop(), fs.index());
+ f(&fd, CHECK);
+ }
}
}
@@ -941,11 +939,11 @@
super->do_nonstatic_fields(cl);
}
fieldDescriptor fd;
- int length = fields()->length();
+ int length = java_fields_count();
// In DebugInfo nonstatic fields are sorted by offset.
int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1));
int j = 0;
- for (int i = 0; i < length; i += next_offset) {
+ for (int i = 0; i < length; i += 1) {
fd.initialize(as_klassOop(), i);
if (!fd.is_static()) {
fields_sorted[j + 0] = fd.offset();
@@ -2411,43 +2409,6 @@
oop_oop_iterate(obj, &blk);
}
-#ifndef PRODUCT
-
-void instanceKlass::verify_class_klass_nonstatic_oop_maps(klassOop k) {
- // This verification code is disabled. JDK_Version::is_gte_jdk14x_version()
- // cannot be called since this function is called before the VM is
- // able to determine what JDK version is running with.
- // The check below always is false since 1.4.
- return;
-
- // This verification code temporarily disabled for the 1.4
- // reflection implementation since java.lang.Class now has
- // Java-level instance fields. Should rewrite this to handle this
- // case.
- if (!(JDK_Version::is_gte_jdk14x_version() && UseNewReflection)) {
- // Verify that java.lang.Class instances have a fake oop field added.
- instanceKlass* ik = instanceKlass::cast(k);
-
- // Check that we have the right class
- static bool first_time = true;
- guarantee(k == SystemDictionary::Class_klass() && first_time, "Invalid verify of maps");
- first_time = false;
- const int extra = java_lang_Class::number_of_fake_oop_fields;
- guarantee(ik->nonstatic_field_size() == extra, "just checking");
- guarantee(ik->nonstatic_oop_map_count() == 1, "just checking");
- guarantee(ik->size_helper() == align_object_size(instanceOopDesc::header_size() + extra), "just checking");
-
- // Check that the map is (2,extra)
- int offset = java_lang_Class::klass_offset;
-
- OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
- guarantee(map->offset() == offset && map->count() == (unsigned int) extra,
- "sanity");
- }
-}
-
-#endif // ndef PRODUCT
-
// JNIid class for jfieldIDs only
// Note to reviewers:
// These JNI functions are just moved over to column 1 and not changed