< prev index next >

src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java

Print this page
rev 16767 : 8175561: Memory churn in jimage code affects startup after resource encapsulation changes
Reviewed-by: jlaskey
rev 16768 : imported patch imgstr_oneup

*** 36,45 **** --- 36,47 ---- * but also compiled and delivered as part of the jrtfs.jar to support access * to the jimage file provided by the shipped JDK by tools running on JDK 8. */ public class ImageStringsReader implements ImageStrings { public static final int HASH_MULTIPLIER = 0x01000193; + public static final int POSITIVE_MASK = 0x7FFFFFFF; + private final BasicImageReader reader; ImageStringsReader(BasicImageReader reader) { this.reader = Objects.requireNonNull(reader); }
*** 52,95 **** @Override public int add(final String string) { throw new InternalError("Can not add strings at runtime"); } ! private static int hashCode(byte[] bytes, int offset, int count, int seed) { ! Objects.requireNonNull(bytes); ! ! if (offset < 0 || count < 0 || offset > bytes.length - count) { ! throw new IndexOutOfBoundsException("offset=" + offset + ", count=" + count); ! } ! ! int limit = offset + count; ! ! if (limit < 0 || limit > bytes.length) { ! throw new IndexOutOfBoundsException("limit=" + limit); ! } ! ! for (int i = offset; i < limit; i++) { ! seed = (seed * HASH_MULTIPLIER) ^ (bytes[i] & 0xFF); ! } ! ! return seed & 0x7FFFFFFF; } ! public static int hashCode(byte[] bytes, int seed) { ! return hashCode(bytes, 0, bytes.length, seed); } ! public static int hashCode(byte[] bytes) { ! return hashCode(bytes, 0, bytes.length, HASH_MULTIPLIER); } ! public static int hashCode(String string) { ! return hashCode(string, HASH_MULTIPLIER); } ! public static int hashCode(String string, int seed) { ! int slen = string.length(); byte[] buffer = null; for (int i = 0; i < slen; i++) { char ch = string.charAt(i); --- 54,84 ---- @Override public int add(final String string) { throw new InternalError("Can not add strings at runtime"); } ! public static int hashCode(String string) { ! return hashCode(string, HASH_MULTIPLIER); } ! public static int hashCode(String string, int seed) { ! return unmaskedHashCode(string, seed) & POSITIVE_MASK; } ! public static int hashCode(String module, String string) { ! return hashCode(module, string, HASH_MULTIPLIER); } ! public static int hashCode(String module, String string, int seed) { ! seed = unmaskedHashCode("/", seed); ! seed = unmaskedHashCode(module, seed); ! seed = unmaskedHashCode("/", seed); ! seed = unmaskedHashCode(string, seed); ! return seed & POSITIVE_MASK; } ! public static int unmaskedHashCode(String string, int seed) { int slen = string.length(); byte[] buffer = null; for (int i = 0; i < slen; i++) { char ch = string.charAt(i);
*** 118,129 **** seed = (seed * HASH_MULTIPLIER) ^ (0x80); } else { seed = (seed * HASH_MULTIPLIER) ^ (uch); } } ! ! return seed & 0x7FFFFFFF; } static int charsFromMUTF8Length(byte[] bytes, int offset, int count) { int length = 0; --- 107,117 ---- seed = (seed * HASH_MULTIPLIER) ^ (0x80); } else { seed = (seed * HASH_MULTIPLIER) ^ (uch); } } ! return seed; } static int charsFromMUTF8Length(byte[] bytes, int offset, int count) { int length = 0;
*** 263,272 **** --- 251,261 ---- } static int mutf8FromStringLength(String s) { int length = 0; int slen = s.length(); + for (int i = 0; i < slen; i++) { char ch = s.charAt(i); int uch = ch & 0xFFFF; if ((uch & ~0x7F) != 0) {
< prev index next >