--- old/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java 2017-02-27 13:57:10.806465570 +0100 +++ new/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java 2017-02-27 13:57:10.610464598 +0100 @@ -249,11 +249,31 @@ return stringsReader; } - public ImageLocation findLocation(String mn, String rn) { - Objects.requireNonNull(mn); - Objects.requireNonNull(rn); + public synchronized ImageLocation findLocation(String module, String name) { + Objects.requireNonNull(module); + Objects.requireNonNull(name); + // Details of the algorithm used here can be found in + // jdk.tools.jlink.internal.PerfectHashBuilder. + int count = header.getTableLength(); + int index = redirect.get(ImageStringsReader.hashCode(module, name) % count); - return findLocation("/" + mn + "/" + rn); + if (index < 0) { + // index is twos complement of location attributes index. + index = -index - 1; + } else if (index > 0) { + // index is hash seed needed to compute location attributes index. + index = ImageStringsReader.hashCode(module, name, index) % count; + } else { + // No entry. + return null; + } + + long[] attributes = getAttributes(offsets.get(index)); + + if (!ImageLocation.verify(module, name, attributes, stringsReader)) { + return null; + } + return new ImageLocation(attributes, stringsReader); } public synchronized ImageLocation findLocation(String name) {