--- old/src/hotspot/share/classfile/javaClasses.cpp 2019-01-10 15:10:50.129536359 +0100 +++ new/src/hotspot/share/classfile/javaClasses.cpp 2019-01-10 15:10:49.821535747 +0100 @@ -2594,11 +2594,13 @@ // Fill in module name and version ModuleEntry* module = holder->module(); if (module->is_named()) { - oop module_name = StringTable::intern(module->name(), CHECK); + oop module_name = java_lang_Module::name(module->module()); java_lang_StackTraceElement::set_moduleName(element(), module_name); oop module_version; if (module->version() != NULL) { - module_version = StringTable::intern(module->version(), CHECK); + oop module_descriptor = java_lang_Module::module_descriptor(module->module()); + oop module_descriptor_version = java_lang_module_ModuleDescriptor::version(module_descriptor); + module_version = java_lang_module_ModuleDescriptor_Version::version(module_descriptor_version); } else { module_version = NULL; } @@ -3102,6 +3104,7 @@ int java_lang_Module::loader_offset; int java_lang_Module::name_offset; +int java_lang_Module::module_descriptor_offset; int java_lang_Module::_module_entry_offset = -1; Handle java_lang_Module::create(Handle loader, Handle module_name, TRAPS) { @@ -3112,8 +3115,9 @@ } #define MODULE_FIELDS_DO(macro) \ - macro(loader_offset, k, vmSymbols::loader_name(), classloader_signature, false); \ - macro(name_offset, k, vmSymbols::name_name(), string_signature, false) + macro(loader_offset, k, vmSymbols::loader_name(), classloader_signature, false); \ + macro(name_offset, k, vmSymbols::name_name(), string_signature, false); \ + macro(module_descriptor_offset, k, vmSymbols::descriptor_name(), module_descriptor_signature, false); \ void java_lang_Module::compute_offsets() { InstanceKlass* k = SystemDictionary::Module_klass(); @@ -3148,6 +3152,12 @@ module->obj_field_put(name_offset, value); } +oop java_lang_Module::module_descriptor(oop module) { + assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); + assert(java_lang_Module::is_instance(module), "sanity"); + return module->obj_field(module_descriptor_offset); +} + ModuleEntry* java_lang_Module::module_entry(oop module) { assert(_module_entry_offset != -1, "Uninitialized module_entry_offset"); assert(module != NULL, "module can't be null"); @@ -3172,6 +3182,58 @@ module->address_field_put(_module_entry_offset, (address)module_entry); } +int java_lang_module_ModuleDescriptor::version_offset; + +#define MODULE_DESCRIPTOR_FIELDS_DO(macro) \ + macro(version_offset, k, vmSymbols::version_name(), module_descriptor_version_signature, false); \ + +void java_lang_module_ModuleDescriptor::compute_offsets() { + InstanceKlass* k = SystemDictionary::ModuleDescriptor_klass(); + MODULE_DESCRIPTOR_FIELDS_DO(FIELD_COMPUTE_OFFSET); +} + +#if INCLUDE_CDS +void java_lang_module_ModuleDescriptor::serialize_offsets(SerializeClosure* f) { + MODULE_DESCRIPTOR_FIELDS_DO(FIELD_SERIALIZE_OFFSET); +} +#endif + +inline bool java_lang_module_ModuleDescriptor::is_instance(oop obj) { + return obj != NULL && obj->klass() == SystemDictionary::ModuleDescriptor_klass(); +} + +oop java_lang_module_ModuleDescriptor::version(oop module_descriptor) { + assert(java_lang_module_ModuleDescriptor::is_instance(module_descriptor), "sanity"); + assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); + return module_descriptor->obj_field(version_offset); +} + +int java_lang_module_ModuleDescriptor_Version::version_offset; + +#define MODULE_DESCRIPTOR_VERSION_FIELDS_DO(macro) \ + macro(version_offset, k, vmSymbols::version_name(), string_signature, false); \ + +void java_lang_module_ModuleDescriptor_Version::compute_offsets() { + InstanceKlass* k = SystemDictionary::ModuleDescriptor_Version_klass(); + MODULE_DESCRIPTOR_VERSION_FIELDS_DO(FIELD_COMPUTE_OFFSET); +} + +#if INCLUDE_CDS +void java_lang_module_ModuleDescriptor_Version::serialize_offsets(SerializeClosure* f) { + MODULE_DESCRIPTOR_VERSION_FIELDS_DO(FIELD_SERIALIZE_OFFSET); +} +#endif + +inline bool java_lang_module_ModuleDescriptor_Version::is_instance(oop obj) { + return obj != NULL && obj->klass() == SystemDictionary::ModuleDescriptor_Version_klass(); +} + +oop java_lang_module_ModuleDescriptor_Version::version(oop module_descriptor_version) { + assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); + assert(java_lang_module_ModuleDescriptor_Version::is_instance(module_descriptor_version), "sanity"); + return module_descriptor_version->obj_field(version_offset); +} + Handle reflect_ConstantPool::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); InstanceKlass* k = SystemDictionary::reflect_ConstantPool_klass();