< prev index next >

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

Print this page

        

*** 23,107 **** * questions. */ package jdk.internal.jimage; ! import java.nio.ByteBuffer; ! import java.util.HashMap; ! class ImageStrings { ! private static final int NOT_FOUND = -1; ! static final int EMPTY_OFFSET = 0; ! ! private final HashMap<UTF8String, Integer> stringToOffsetMap; ! private final ImageStream stream; ! ! ImageStrings() { ! this.stringToOffsetMap = new HashMap<>(); ! this.stream = new ImageStream(); ! ! // Reserve 0 offset for empty string. ! int offset = addString(UTF8String.EMPTY_STRING); ! assert offset == 0 : "Empty string not zero offset"; ! // Reserve 1 offset for frequently used ".class". ! addString(UTF8String.CLASS_STRING); ! } ! ! ImageStrings(ImageStream stream) { ! this.stringToOffsetMap = new HashMap<>(); ! this.stream = stream; ! } ! ! private int addString(final UTF8String string) { ! int offset = stream.getPosition(); ! string.writeTo(stream); ! stream.put('\0'); ! stringToOffsetMap.put(string, offset); ! ! return offset; ! } ! ! int add(final UTF8String string) { ! int offset = find(string); ! ! return offset == NOT_FOUND ? addString(string) : offset; ! } ! ! int find(final UTF8String string) { ! Integer offset = stringToOffsetMap.get(string); ! ! return offset != null ? offset : NOT_FOUND; ! } ! ! UTF8String get(int offset) { ! ByteBuffer buffer = stream.getBuffer(); ! assert 0 <= offset && offset < buffer.capacity() : "String buffer offset out of range"; ! int zero = NOT_FOUND; ! for (int i = offset; i < buffer.capacity(); i++) { ! if (buffer.get(i) == '\0') { ! zero = i; ! break; ! } ! } ! assert zero != UTF8String.NOT_FOUND; ! int length = zero - offset; ! byte[] bytes = new byte[length]; ! int mark = buffer.position(); ! buffer.position(offset); ! buffer.get(bytes); ! buffer.position(mark); ! ! return new UTF8String(bytes, 0, length); ! } ! ! ImageStream getStream() { ! return stream; ! } ! ! int getSize() { ! return stream.getSize(); ! } ! ! int getCount() { ! return stringToOffsetMap.size(); ! } } --- 23,32 ---- * questions. */ package jdk.internal.jimage; ! interface ImageStrings { ! public UTF8String get(int offset); ! public int add(final UTF8String string); }
< prev index next >