hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
changeset 19961 04405a08613f
parent 19960 49697a1e3782
child 19962 a1ff113a3e74
equal deleted inserted replaced
19960:49697a1e3782 19961:04405a08613f
  1393   // garbage,  if it crosses a card boundary, it may be scanned
  1393   // garbage,  if it crosses a card boundary, it may be scanned
  1394   // in order to find the start of the first complete object on the card.
  1394   // in order to find the start of the first complete object on the card.
  1395   ClassLoaderData* loader_data = the_class->class_loader_data();
  1395   ClassLoaderData* loader_data = the_class->class_loader_data();
  1396   ConstantPool* merge_cp_oop =
  1396   ConstantPool* merge_cp_oop =
  1397     ConstantPool::allocate(loader_data,
  1397     ConstantPool::allocate(loader_data,
  1398                                   merge_cp_length,
  1398                            merge_cp_length,
  1399                                   THREAD);
  1399                            CHECK_(JVMTI_ERROR_OUT_OF_MEMORY));
  1400   MergeCPCleaner cp_cleaner(loader_data, merge_cp_oop);
  1400   MergeCPCleaner cp_cleaner(loader_data, merge_cp_oop);
  1401 
  1401 
  1402   HandleMark hm(THREAD);  // make sure handles are cleared before
  1402   HandleMark hm(THREAD);  // make sure handles are cleared before
  1403                           // MergeCPCleaner clears out merge_cp_oop
  1403                           // MergeCPCleaner clears out merge_cp_oop
  1404   constantPoolHandle merge_cp(THREAD, merge_cp_oop);
  1404   constantPoolHandle merge_cp(THREAD, merge_cp_oop);
  1470       // and merged constant pools are supersets of the new constant
  1470       // and merged constant pools are supersets of the new constant
  1471       // pool.
  1471       // pool.
  1472 
  1472 
  1473       // Replace the new constant pool with a shrunken copy of the
  1473       // Replace the new constant pool with a shrunken copy of the
  1474       // merged constant pool
  1474       // merged constant pool
  1475       set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length, THREAD);
  1475       set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length,
       
  1476                             CHECK_(JVMTI_ERROR_OUT_OF_MEMORY));
  1476       // The new constant pool replaces scratch_cp so have cleaner clean it up.
  1477       // The new constant pool replaces scratch_cp so have cleaner clean it up.
  1477       // It can't be cleaned up while there are handles to it.
  1478       // It can't be cleaned up while there are handles to it.
  1478       cp_cleaner.add_scratch_cp(scratch_cp());
  1479       cp_cleaner.add_scratch_cp(scratch_cp());
  1479     }
  1480     }
  1480   } else {
  1481   } else {
  1500 
  1501 
  1501     // Replace the new constant pool with a shrunken copy of the
  1502     // Replace the new constant pool with a shrunken copy of the
  1502     // merged constant pool so now the rewritten bytecodes have
  1503     // merged constant pool so now the rewritten bytecodes have
  1503     // valid references; the previous new constant pool will get
  1504     // valid references; the previous new constant pool will get
  1504     // GCed.
  1505     // GCed.
  1505     set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length, THREAD);
  1506     set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length,
       
  1507                           CHECK_(JVMTI_ERROR_OUT_OF_MEMORY));
  1506     // The new constant pool replaces scratch_cp so have cleaner clean it up.
  1508     // The new constant pool replaces scratch_cp so have cleaner clean it up.
  1507     // It can't be cleaned up while there are handles to it.
  1509     // It can't be cleaned up while there are handles to it.
  1508     cp_cleaner.add_scratch_cp(scratch_cp());
  1510     cp_cleaner.add_scratch_cp(scratch_cp());
  1509   }
  1511   }
  1510 
  1512 
  2494   assert(scratch_cp->length() >= scratch_cp_length, "sanity check");
  2496   assert(scratch_cp->length() >= scratch_cp_length, "sanity check");
  2495 
  2497 
  2496   // scratch_cp is a merged constant pool and has enough space for a
  2498   // scratch_cp is a merged constant pool and has enough space for a
  2497   // worst case merge situation. We want to associate the minimum
  2499   // worst case merge situation. We want to associate the minimum
  2498   // sized constant pool with the klass to save space.
  2500   // sized constant pool with the klass to save space.
  2499   constantPoolHandle smaller_cp(THREAD,
  2501   ConstantPool* cp = ConstantPool::allocate(loader_data, scratch_cp_length, CHECK);
  2500           ConstantPool::allocate(loader_data, scratch_cp_length, THREAD));
  2502   constantPoolHandle smaller_cp(THREAD, cp);
  2501 
  2503 
  2502   // preserve version() value in the smaller copy
  2504   // preserve version() value in the smaller copy
  2503   int version = scratch_cp->version();
  2505   int version = scratch_cp->version();
  2504   assert(version != 0, "sanity check");
  2506   assert(version != 0, "sanity check");
  2505   smaller_cp->set_version(version);
  2507   smaller_cp->set_version(version);
  2507   // attach klass to new constant pool
  2509   // attach klass to new constant pool
  2508   // reference to the cp holder is needed for copy_operands()
  2510   // reference to the cp holder is needed for copy_operands()
  2509   smaller_cp->set_pool_holder(scratch_class());
  2511   smaller_cp->set_pool_holder(scratch_class());
  2510 
  2512 
  2511   scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD);
  2513   scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD);
       
  2514   if (HAS_PENDING_EXCEPTION) {
       
  2515     // Exception is handled in the caller
       
  2516     loader_data->add_to_deallocate_list(smaller_cp());
       
  2517     return;
       
  2518   }
  2512   scratch_cp = smaller_cp;
  2519   scratch_cp = smaller_cp;
  2513 
  2520 
  2514   // attach new constant pool to klass
  2521   // attach new constant pool to klass
  2515   scratch_class->set_constants(scratch_cp());
  2522   scratch_class->set_constants(scratch_cp());
  2516 
  2523