# HG changeset patch # User jiangli # Date 1506559233 14400 # Node ID 0a0fae0c05ac0c2d712c99dfb6d1eefc5ff59bbe # Parent 664b9d44db74383107cc448c0dd8f08ea1ea3b7e 8186789: CDS dump crashes at ConstantPool::resolve_class_constants Summary: ConstantPool::resolve_class_constants needs to check for NULL _cache. Reviewed-by: sspitsyn, coleenp, iklam diff -r 664b9d44db74 -r 0a0fae0c05ac src/hotspot/share/oops/constantPool.cpp --- a/src/hotspot/share/oops/constantPool.cpp Wed Sep 27 17:55:20 2017 -0400 +++ b/src/hotspot/share/oops/constantPool.cpp Wed Sep 27 20:40:33 2017 -0400 @@ -294,6 +294,28 @@ set_resolved_references(NULL); } } + +void ConstantPool::resolve_class_constants(TRAPS) { + assert(DumpSharedSpaces, "used during dump time only"); + // The _cache may be NULL if the _pool_holder klass fails verification + // at dump time due to missing dependencies. + if (cache() == NULL || reference_map() == NULL) { + return; // nothing to do + } + + constantPoolHandle cp(THREAD, this); + for (int index = 1; index < length(); index++) { // Index 0 is unused + if (tag_at(index).is_string()) { + Symbol* sym = cp->unresolved_string_at(index); + // Look up only. Only resolve references to already interned strings. + oop str = StringTable::lookup(sym); + if (str != NULL) { + int cache_index = cp->cp_to_object_index(index); + cp->string_at_put(index, cache_index, str); + } + } + } +} #endif // CDS support. Create a new resolved_references array. @@ -722,22 +744,6 @@ } } -bool ConstantPool::resolve_class_constants(TRAPS) { - constantPoolHandle cp(THREAD, this); - for (int index = 1; index < length(); index++) { // Index 0 is unused - if (tag_at(index).is_string()) { - Symbol* sym = cp->unresolved_string_at(index); - // Look up only. Only resolve references to already interned strings. - oop str = StringTable::lookup(sym); - if (str != NULL) { - int cache_index = cp->cp_to_object_index(index); - cp->string_at_put(index, cache_index, str); - } - } - } - return true; -} - Symbol* ConstantPool::exception_message(const constantPoolHandle& this_cp, int which, constantTag tag, oop pending_exception) { // Dig out the detailed message to reuse if possible Symbol* message = java_lang_Throwable::detail_message(pending_exception); diff -r 664b9d44db74 -r 0a0fae0c05ac src/hotspot/share/oops/constantPool.hpp --- a/src/hotspot/share/oops/constantPool.hpp Wed Sep 27 17:55:20 2017 -0400 +++ b/src/hotspot/share/oops/constantPool.hpp Wed Sep 27 20:40:33 2017 -0400 @@ -717,9 +717,9 @@ // CDS support void archive_resolved_references(Thread *THREAD) NOT_CDS_JAVA_HEAP_RETURN; + void resolve_class_constants(TRAPS) NOT_CDS_JAVA_HEAP_RETURN; void remove_unshareable_info(); void restore_unshareable_info(TRAPS); - bool resolve_class_constants(TRAPS); // The ConstantPool vtable is restored by this call when the ConstantPool is // in the shared archive. See patch_klass_vtables() in metaspaceShared.cpp for // all the gory details. SA, dtrace and pstack helpers distinguish metadata