< 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 >