equal
deleted
inserted
replaced
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 |