aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/prims
diff options
context:
space:
mode:
authorjiangli <none@none>2012-03-13 13:50:48 -0400
committerjiangli <none@none>2012-03-13 13:50:48 -0400
commitc8d1e1d6fec8ef6477615906d41b3ffbc48dddf6 (patch)
tree528798dc427d79ce740515a35663e06a7fff500f /src/share/vm/prims
parent9c441831c27bbce63d51feacd7ae45174a09f725 (diff)
7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
Summary: Fold instanceKlass::_enclosing_method_class_index and instanceKlass::_enclosing_method_method_index into the instanceKlass::_inner_classes array. Reviewed-by: never, coleenp Contributed-by: Jiangli Zhou <jiangli.zhou@oracle.com>
Diffstat (limited to 'src/share/vm/prims')
-rw-r--r--src/share/vm/prims/jvm.cpp31
-rw-r--r--src/share/vm/prims/jvmtiClassFileReconstituter.cpp24
-rw-r--r--src/share/vm/prims/jvmtiRedefineClasses.cpp65
3 files changed, 48 insertions, 72 deletions
diff --git a/src/share/vm/prims/jvm.cpp b/src/share/vm/prims/jvm.cpp
index 4c503fea3..3f097819e 100644
--- a/src/share/vm/prims/jvm.cpp
+++ b/src/share/vm/prims/jvm.cpp
@@ -1301,9 +1301,6 @@ JVM_END
// Inner class reflection ///////////////////////////////////////////////////////////////////////////////
JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
- const int inner_class_info_index = 0;
- const int outer_class_info_index = 1;
-
JvmtiVMObjectAllocEventCollector oam;
// ofClass is a reference to a java_lang_Class object. The mirror object
// of an instanceKlass
@@ -1315,26 +1312,26 @@ JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
}
instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
+ InnerClassesIterator iter(k);
- if (k->inner_classes()->length() == 0) {
+ if (iter.length() == 0) {
// Neither an inner nor outer class
oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
return (jobjectArray)JNIHandles::make_local(env, result);
}
// find inner class info
- typeArrayHandle icls(thread, k->inner_classes());
constantPoolHandle cp(thread, k->constants());
- int length = icls->length();
+ int length = iter.length();
// Allocate temp. result array
objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL);
objArrayHandle result (THREAD, r);
int members = 0;
- for(int i = 0; i < length; i += 4) {
- int ioff = icls->ushort_at(i + inner_class_info_index);
- int ooff = icls->ushort_at(i + outer_class_info_index);
+ for (; !iter.done(); iter.next()) {
+ int ioff = iter.inner_class_info_index();
+ int ooff = iter.outer_class_info_index();
if (ioff != 0 && ooff != 0) {
// Check to see if the name matches the class we're looking for
@@ -1392,17 +1389,13 @@ klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
bool* inner_is_member,
TRAPS) {
Thread* thread = THREAD;
- const int inner_class_info_index = inner_class_inner_class_info_offset;
- const int outer_class_info_index = inner_class_outer_class_info_offset;
-
- if (k->inner_classes()->length() == 0) {
+ InnerClassesIterator iter(k);
+ if (iter.length() == 0) {
// No inner class info => no declaring class
return NULL;
}
- typeArrayHandle i_icls(thread, k->inner_classes());
constantPoolHandle i_cp(thread, k->constants());
- int i_length = i_icls->length();
bool found = false;
klassOop ok;
@@ -1410,10 +1403,10 @@ klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
*inner_is_member = false;
// Find inner_klass attribute
- for (int i = 0; i < i_length && !found; i += inner_class_next_offset) {
- int ioff = i_icls->ushort_at(i + inner_class_info_index);
- int ooff = i_icls->ushort_at(i + outer_class_info_index);
- int noff = i_icls->ushort_at(i + inner_class_inner_name_offset);
+ for (; !iter.done() && !found; iter.next()) {
+ int ioff = iter.inner_class_info_index();
+ int ooff = iter.outer_class_info_index();
+ int noff = iter.inner_name_index();
if (ioff != 0) {
// Check to see if the name matches the class we're looking for
// before attempting to find the class.
diff --git a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
index af576eb28..d7dfea5a9 100644
--- a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
+++ b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
@@ -292,8 +292,8 @@ void JvmtiClassFileReconstituter::write_signature_attribute(u2 generic_signature
// Compute the number of entries in the InnerClasses attribute
u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
- typeArrayOop inner_class_list = ikh()->inner_classes();
- return (inner_class_list == NULL) ? 0 : inner_class_list->length();
+ InnerClassesIterator iter(ikh());
+ return iter.length();
}
// Write an annotation attribute. The VM stores them in raw form, so all we need
@@ -324,26 +324,20 @@ void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_n
// JVMSpec| } classes[number_of_classes];
// JVMSpec| }
void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
- typeArrayOop inner_class_list = ikh()->inner_classes();
- guarantee(inner_class_list != NULL && inner_class_list->length() == length,
+ InnerClassesIterator iter(ikh());
+ guarantee(iter.length() != 0 && iter.length() == length,
"caller must check");
- typeArrayHandle inner_class_list_h(thread(), inner_class_list);
- assert (length % instanceKlass::inner_class_next_offset == 0, "just checking");
u2 entry_count = length / instanceKlass::inner_class_next_offset;
u4 size = 2 + entry_count * (2+2+2+2);
write_attribute_name_index("InnerClasses");
write_u4(size);
write_u2(entry_count);
- for (int i = 0; i < length; i += instanceKlass::inner_class_next_offset) {
- write_u2(inner_class_list_h->ushort_at(
- i + instanceKlass::inner_class_inner_class_info_offset));
- write_u2(inner_class_list_h->ushort_at(
- i + instanceKlass::inner_class_outer_class_info_offset));
- write_u2(inner_class_list_h->ushort_at(
- i + instanceKlass::inner_class_inner_name_offset));
- write_u2(inner_class_list_h->ushort_at(
- i + instanceKlass::inner_class_access_flags_offset));
+ for (; !iter.done(); iter.next()) {
+ write_u2(iter.inner_class_info_index());
+ write_u2(iter.outer_class_info_index());
+ write_u2(iter.inner_name_index());
+ write_u2(iter.inner_access_flags());
}
}
diff --git a/src/share/vm/prims/jvmtiRedefineClasses.cpp b/src/share/vm/prims/jvmtiRedefineClasses.cpp
index 295ed8664..2caecf680 100644
--- a/src/share/vm/prims/jvmtiRedefineClasses.cpp
+++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp
@@ -2400,44 +2400,33 @@ void VM_RedefineClasses::set_new_constant_pool(
// new constant indices as needed. The inner classes info is a
// quadruple:
// (inner_class_info, outer_class_info, inner_name, inner_access_flags)
- typeArrayOop inner_class_list = scratch_class->inner_classes();
- int icl_length = (inner_class_list == NULL) ? 0 : inner_class_list->length();
- if (icl_length > 0) {
- typeArrayHandle inner_class_list_h(THREAD, inner_class_list);
- for (int i = 0; i < icl_length;
- i += instanceKlass::inner_class_next_offset) {
- int cur_index = inner_class_list_h->ushort_at(i
- + instanceKlass::inner_class_inner_class_info_offset);
- if (cur_index == 0) {
- continue; // JVM spec. allows null inner class refs so skip it
- }
- int new_index = find_new_index(cur_index);
- if (new_index != 0) {
- RC_TRACE_WITH_THREAD(0x00080000, THREAD,
- ("inner_class_info change: %d to %d", cur_index, new_index));
- inner_class_list_h->ushort_at_put(i
- + instanceKlass::inner_class_inner_class_info_offset, new_index);
- }
- cur_index = inner_class_list_h->ushort_at(i
- + instanceKlass::inner_class_outer_class_info_offset);
- new_index = find_new_index(cur_index);
- if (new_index != 0) {
- RC_TRACE_WITH_THREAD(0x00080000, THREAD,
- ("outer_class_info change: %d to %d", cur_index, new_index));
- inner_class_list_h->ushort_at_put(i
- + instanceKlass::inner_class_outer_class_info_offset, new_index);
- }
- cur_index = inner_class_list_h->ushort_at(i
- + instanceKlass::inner_class_inner_name_offset);
- new_index = find_new_index(cur_index);
- if (new_index != 0) {
- RC_TRACE_WITH_THREAD(0x00080000, THREAD,
- ("inner_name change: %d to %d", cur_index, new_index));
- inner_class_list_h->ushort_at_put(i
- + instanceKlass::inner_class_inner_name_offset, new_index);
- }
- } // end for each inner class
- } // end if we have inner classes
+ InnerClassesIterator iter(scratch_class);
+ for (; !iter.done(); iter.next()) {
+ int cur_index = iter.inner_class_info_index();
+ if (cur_index == 0) {
+ continue; // JVM spec. allows null inner class refs so skip it
+ }
+ int new_index = find_new_index(cur_index);
+ if (new_index != 0) {
+ RC_TRACE_WITH_THREAD(0x00080000, THREAD,
+ ("inner_class_info change: %d to %d", cur_index, new_index));
+ iter.set_inner_class_info_index(new_index);
+ }
+ cur_index = iter.outer_class_info_index();
+ new_index = find_new_index(cur_index);
+ if (new_index != 0) {
+ RC_TRACE_WITH_THREAD(0x00080000, THREAD,
+ ("outer_class_info change: %d to %d", cur_index, new_index));
+ iter.set_outer_class_info_index(new_index);
+ }
+ cur_index = iter.inner_name_index();
+ new_index = find_new_index(cur_index);
+ if (new_index != 0) {
+ RC_TRACE_WITH_THREAD(0x00080000, THREAD,
+ ("inner_name change: %d to %d", cur_index, new_index));
+ iter.set_inner_name_index(new_index);
+ }
+ } // end for each inner class
// Attach each method in klass to the new constant pool and update
// to use new constant pool indices as needed: