hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
changeset 12231 6a9cfc59a18a
parent 11399 5dd5c4dd4b7d
child 13282 9872915dd78d
child 13195 be27e1b6a4b9
equal deleted inserted replaced
12112:56e3093129dc 12231:6a9cfc59a18a
  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--) {