--- a/src/hotspot/share/runtime/thread.cpp Tue Oct 29 15:16:45 2019 +0100
+++ b/src/hotspot/share/runtime/thread.cpp Wed Oct 30 11:23:55 2019 +0100
@@ -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);