diff -r 31ec3e55fa3d -r 6c255334120d src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp Tue Oct 29 11:33:25 2019 +0100 +++ b/src/hotspot/share/runtime/thread.cpp Tue Oct 29 08:26:55 2019 -0700 @@ -1090,6 +1090,8 @@ char java_runtime_name[128] = ""; char java_runtime_version[128] = ""; +char java_runtime_vendor_version[128] = ""; +char java_runtime_vendor_vm_bug_url[128] = ""; // extract the JRE name from java.lang.VersionProps.java_runtime_name static const char* get_java_runtime_name(TRAPS) { @@ -1135,6 +1137,50 @@ } } +// extract the JRE vendor version from java.lang.VersionProps.VENDOR_VERSION +static const char* get_java_runtime_vendor_version(TRAPS) { + Klass* k = SystemDictionary::find(vmSymbols::java_lang_VersionProps(), + Handle(), Handle(), CHECK_AND_CLEAR_NULL); + fieldDescriptor fd; + bool found = k != NULL && + InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_vendor_version_name(), + vmSymbols::string_signature(), &fd); + if (found) { + oop name_oop = k->java_mirror()->obj_field(fd.offset()); + if (name_oop == NULL) { + return NULL; + } + const char* name = java_lang_String::as_utf8_string(name_oop, + java_runtime_vendor_version, + sizeof(java_runtime_vendor_version)); + return name; + } else { + return NULL; + } +} + +// extract the JRE vendor VM bug URL from java.lang.VersionProps.VENDOR_URL_VM_BUG +static const char* get_java_runtime_vendor_vm_bug_url(TRAPS) { + Klass* k = SystemDictionary::find(vmSymbols::java_lang_VersionProps(), + Handle(), Handle(), CHECK_AND_CLEAR_NULL); + fieldDescriptor fd; + bool found = k != NULL && + InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_vendor_vm_bug_url_name(), + vmSymbols::string_signature(), &fd); + if (found) { + oop name_oop = k->java_mirror()->obj_field(fd.offset()); + if (name_oop == NULL) { + return NULL; + } + const char* name = java_lang_String::as_utf8_string(name_oop, + java_runtime_vendor_vm_bug_url, + sizeof(java_runtime_vendor_vm_bug_url)); + return name; + } else { + return NULL; + } +} + // General purpose hook into Java code, run once when the VM is initialized. // The Java library method itself may be changed independently from the VM. static void call_postVMInitHook(TRAPS) { @@ -3656,9 +3702,11 @@ // Phase 1 of the system initialization in the library, java.lang.System class initialization call_initPhase1(CHECK); - // get the Java runtime name after java.lang.System is initialized + // get the Java runtime name, version, and vendor info after java.lang.System is initialized JDK_Version::set_runtime_name(get_java_runtime_name(THREAD)); JDK_Version::set_runtime_version(get_java_runtime_version(THREAD)); + JDK_Version::set_runtime_vendor_version(get_java_runtime_vendor_version(THREAD)); + JDK_Version::set_runtime_vendor_vm_bug_url(get_java_runtime_vendor_vm_bug_url(THREAD)); // an instance of OutOfMemory exception has been allocated earlier initialize_class(vmSymbols::java_lang_OutOfMemoryError(), CHECK);