comparison src/share/vm/prims/jvmtiRedefineClasses.cpp @ 5967:f7c4174b33ba

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>
author jiangli
date Tue, 13 Mar 2012 13:50:48 -0400
parents 4ceaf61479fc
children d2a62e0f25eb 8150fa46d2ed
comparison
equal deleted inserted replaced
5933:fde683df4c27 5967:f7c4174b33ba
2398 2398
2399 // Update constant pool indices in the inner classes info to use 2399 // Update constant pool indices in the inner classes info to use
2400 // new constant indices as needed. The inner classes info is a 2400 // new constant indices as needed. The inner classes info is a
2401 // quadruple: 2401 // quadruple:
2402 // (inner_class_info, outer_class_info, inner_name, inner_access_flags) 2402 // (inner_class_info, outer_class_info, inner_name, inner_access_flags)
2403 typeArrayOop inner_class_list = scratch_class->inner_classes(); 2403 InnerClassesIterator iter(scratch_class);
2404 int icl_length = (inner_class_list == NULL) ? 0 : inner_class_list->length(); 2404 for (; !iter.done(); iter.next()) {
2405 if (icl_length > 0) { 2405 int cur_index = iter.inner_class_info_index();
2406 typeArrayHandle inner_class_list_h(THREAD, inner_class_list); 2406 if (cur_index == 0) {
2407 for (int i = 0; i < icl_length; 2407 continue; // JVM spec. allows null inner class refs so skip it
2408 i += instanceKlass::inner_class_next_offset) { 2408 }
2409 int cur_index = inner_class_list_h->ushort_at(i 2409 int new_index = find_new_index(cur_index);
2410 + instanceKlass::inner_class_inner_class_info_offset); 2410 if (new_index != 0) {
2411 if (cur_index == 0) { 2411 RC_TRACE_WITH_THREAD(0x00080000, THREAD,
2412 continue; // JVM spec. allows null inner class refs so skip it 2412 ("inner_class_info change: %d to %d", cur_index, new_index));
2413 } 2413 iter.set_inner_class_info_index(new_index);
2414 int new_index = find_new_index(cur_index); 2414 }
2415 if (new_index != 0) { 2415 cur_index = iter.outer_class_info_index();
2416 RC_TRACE_WITH_THREAD(0x00080000, THREAD, 2416 new_index = find_new_index(cur_index);
2417 ("inner_class_info change: %d to %d", cur_index, new_index)); 2417 if (new_index != 0) {
2418 inner_class_list_h->ushort_at_put(i 2418 RC_TRACE_WITH_THREAD(0x00080000, THREAD,
2419 + instanceKlass::inner_class_inner_class_info_offset, new_index); 2419 ("outer_class_info change: %d to %d", cur_index, new_index));
2420 } 2420 iter.set_outer_class_info_index(new_index);
2421 cur_index = inner_class_list_h->ushort_at(i 2421 }
2422 + instanceKlass::inner_class_outer_class_info_offset); 2422 cur_index = iter.inner_name_index();
2423 new_index = find_new_index(cur_index); 2423 new_index = find_new_index(cur_index);
2424 if (new_index != 0) { 2424 if (new_index != 0) {
2425 RC_TRACE_WITH_THREAD(0x00080000, THREAD, 2425 RC_TRACE_WITH_THREAD(0x00080000, THREAD,
2426 ("outer_class_info change: %d to %d", cur_index, new_index)); 2426 ("inner_name change: %d to %d", cur_index, new_index));
2427 inner_class_list_h->ushort_at_put(i 2427 iter.set_inner_name_index(new_index);
2428 + instanceKlass::inner_class_outer_class_info_offset, new_index); 2428 }
2429 } 2429 } // end for each inner class
2430 cur_index = inner_class_list_h->ushort_at(i
2431 + instanceKlass::inner_class_inner_name_offset);
2432 new_index = find_new_index(cur_index);
2433 if (new_index != 0) {
2434 RC_TRACE_WITH_THREAD(0x00080000, THREAD,
2435 ("inner_name change: %d to %d", cur_index, new_index));
2436 inner_class_list_h->ushort_at_put(i
2437 + instanceKlass::inner_class_inner_name_offset, new_index);
2438 }
2439 } // end for each inner class
2440 } // end if we have inner classes
2441 2430
2442 // Attach each method in klass to the new constant pool and update 2431 // Attach each method in klass to the new constant pool and update
2443 // to use new constant pool indices as needed: 2432 // to use new constant pool indices as needed:
2444 objArrayHandle methods(THREAD, scratch_class->methods()); 2433 objArrayHandle methods(THREAD, scratch_class->methods());
2445 for (i = methods->length() - 1; i >= 0; i--) { 2434 for (i = methods->length() - 1; i >= 0; i--) {