--- old/src/hotspot/share/classfile/systemDictionaryShared.cpp 2019-10-09 14:25:40.969552728 -0700 +++ new/src/hotspot/share/classfile/systemDictionaryShared.cpp 2019-10-09 14:25:40.713543433 -0700 @@ -906,14 +906,9 @@ return NULL; } - const RunTimeSharedClassInfo* record = find_record(&_unregistered_dictionary, class_name); + const RunTimeSharedClassInfo* record = find_record(&_unregistered_dictionary, &_dynamic_unregistered_dictionary, class_name); if (record == NULL) { - if (DynamicArchive::is_mapped()) { - record = find_record(&_dynamic_unregistered_dictionary, class_name); - } - if (record == NULL) { - return NULL; - } + return NULL; } int clsfile_size = cfs->length(); @@ -1413,29 +1408,34 @@ } const RunTimeSharedClassInfo* -SystemDictionaryShared::find_record(RunTimeSharedDictionary* dict, Symbol* name) { - if (UseSharedSpaces) { - unsigned int hash = primitive_hash(name); - return dict->lookup(name, hash, 0); - } else { +SystemDictionaryShared::find_record(RunTimeSharedDictionary* static_dict, RunTimeSharedDictionary* dynamic_dict, Symbol* name) { + if (!UseSharedSpaces || !name->is_shared()) { + // The names of all shared classes must also be a shared Symbol. return NULL; } -} -InstanceKlass* SystemDictionaryShared::find_builtin_class(Symbol* name) { - const RunTimeSharedClassInfo* record = find_record(&_builtin_dictionary, name); - if (record) { - return record->_klass; + unsigned int hash = primitive_hash(name); + const RunTimeSharedClassInfo* record = NULL; + if (!MetaspaceShared::is_shared_dynamic(name)) { + // The names of all shared classes in the static dict must also be in the + // static archive + record = static_dict->lookup(name, hash, 0); } - if (DynamicArchive::is_mapped()) { - record = find_record(&_dynamic_builtin_dictionary, name); - if (record) { - return record->_klass; - } + if (record == NULL && DynamicArchive::is_mapped()) { + record = dynamic_dict->lookup(name, hash, 0); } - return NULL; + return record; +} + +InstanceKlass* SystemDictionaryShared::find_builtin_class(Symbol* name) { + const RunTimeSharedClassInfo* record = find_record(&_builtin_dictionary, &_dynamic_builtin_dictionary, name); + if (record != NULL) { + return record->_klass; + } else { + return NULL; + } } void SystemDictionaryShared::update_shared_entry(InstanceKlass* k, int id) { --- old/src/hotspot/share/classfile/systemDictionaryShared.hpp 2019-10-09 14:25:41.629576692 -0700 +++ new/src/hotspot/share/classfile/systemDictionaryShared.hpp 2019-10-09 14:25:41.369567252 -0700 @@ -223,7 +223,9 @@ public: static InstanceKlass* find_builtin_class(Symbol* class_name); - static const RunTimeSharedClassInfo* find_record(RunTimeSharedDictionary* dict, Symbol* name); + static const RunTimeSharedClassInfo* find_record(RunTimeSharedDictionary* static_dict, + RunTimeSharedDictionary* dynamic_dict, + Symbol* name); static bool has_platform_or_app_classes();