src/hotspot/share/classfile/classLoader.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/hotspot/share/classfile/classLoader.cpp	Tue Jul  3 14:11:31 2018
--- new/src/hotspot/share/classfile/classLoader.cpp	Tue Jul  3 14:11:31 2018

*** 296,307 **** --- 296,305 ---- ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name, bool is_boot_append) : ClassPathEntry() { _zip = zip; char *copy = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass); strcpy(copy, zip_name); _zip_name = copy; _is_boot_append = is_boot_append; _multi_versioned = _unknown; } ClassPathZipEntry::~ClassPathZipEntry() { if (ZipClose != NULL) { (*ZipClose)(_zip);
*** 336,435 **** --- 334,349 ---- buffer[*filesize] = 0; } return buffer; } #if INCLUDE_CDS u1* ClassPathZipEntry::open_versioned_entry(const char* name, jint* filesize, TRAPS) { u1* buffer = NULL; if (DumpSharedSpaces && !_is_boot_append) { // We presume default is multi-release enabled const char* multi_ver = Arguments::get_property("jdk.util.jar.enableMultiRelease"); const char* verstr = Arguments::get_property("jdk.util.jar.version"); bool is_multi_ver = (multi_ver == NULL || strcmp(multi_ver, "true") == 0 || strcmp(multi_ver, "force") == 0) && is_multiple_versioned(THREAD); // command line version setting int version = 0; const int base_version = 8; // JDK8 int cur_ver = JDK_Version::current().major_version(); if (verstr != NULL) { version = atoi(verstr); if (version < base_version || version > cur_ver) { // If the specified version is lower than the base version, the base // entry will be used; if the version is higher than the current // jdk version, the highest versioned entry will be used. if (version < base_version) { is_multi_ver = false; } // print out warning, do not use assertion here since it will continue to look // for proper version. warning("JDK%d is not supported in multiple version jars", version); } } if (is_multi_ver) { int n; const char* version_entry = "META-INF/versions/"; // 10 is the max length of a decimal 32-bit non-negative number // 2 includes the '/' and trailing zero size_t entry_name_len = strlen(version_entry) + 10 + strlen(name) + 2; char* entry_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, entry_name_len); if (version > 0) { n = jio_snprintf(entry_name, entry_name_len, "%s%d/%s", version_entry, version, name); entry_name[n] = '\0'; buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL); if (buffer == NULL) { warning("Could not find %s in %s, try to find highest version instead", entry_name, _zip_name); } } if (buffer == NULL) { for (int i = cur_ver; i >= base_version; i--) { n = jio_snprintf(entry_name, entry_name_len, "%s%d/%s", version_entry, i, name); entry_name[n] = '\0'; buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL); if (buffer != NULL) { break; } } } FREE_RESOURCE_ARRAY(char, entry_name, entry_name_len); } } return buffer; } bool ClassPathZipEntry::is_multiple_versioned(TRAPS) { assert(DumpSharedSpaces, "called only at dump time"); if (_multi_versioned != _unknown) { return (_multi_versioned == _yes) ? true : false; } jint size; char* buffer = (char*)open_entry("META-INF/MANIFEST.MF", &size, true, CHECK_false); if (buffer != NULL) { char* p = buffer; for ( ; *p; ++p) *p = tolower(*p); if (strstr(buffer, "multi-release: true") != NULL) { _multi_versioned = _yes; return true; } } _multi_versioned = _no; return false; } #endif // INCLUDE_CDS ClassFileStream* ClassPathZipEntry::open_stream(const char* name, TRAPS) { jint filesize; ! u1* buffer = open_versioned_entry(name, &filesize, CHECK_NULL); if (buffer == NULL) { buffer = open_entry(name, &filesize, false, CHECK_NULL); ! u1* buffer = open_entry(name, &filesize, false, CHECK_NULL); if (buffer == NULL) { return NULL; } } if (UsePerfData) { ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize); } // Resource allocated return new ClassFileStream(buffer,

src/hotspot/share/classfile/classLoader.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File