Mercurial > hg > graal-jvmci-8
changeset 23350:5e8be3095c53
Handle Strings larger than buffer size properly in IGV
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Mon, 18 Apr 2016 10:18:48 -0700 |
parents | bd8c5c264c42 |
children | 1c62a8bac25a |
files | src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java |
diffstat | 1 files changed, 14 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java Thu Apr 14 15:56:53 2016 -0700 +++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java Mon Apr 18 10:18:48 2016 -0700 @@ -31,6 +31,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; +import java.nio.charset.Charset; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,6 +68,8 @@ private static final int PROPERTY_SUBGRAPH = 0x08; private static final String NO_BLOCK = "noBlock"; + + private static final Charset utf8 = Charset.forName("UTF-8"); private final GroupCallback callback; private final List<Object> constantPool; @@ -335,12 +338,7 @@ } private String readString() throws IOException { - int len = readInt(); - ensureAvailable(len * 2); - char[] chars = new char[len]; - buffer.asCharBuffer().get(chars); - buffer.position(buffer.position() + len * 2); - return new String(chars).intern(); + return new String(readBytes(), utf8).intern(); } private byte[] readBytes() throws IOException { @@ -348,12 +346,17 @@ if (len < 0) { return null; } - ensureAvailable(len); - byte[] data = new byte[len]; - buffer.get(data); - return data; + byte[] b = new byte[len]; + int bytesRead = 0; + while (bytesRead < b.length) { + int toRead = Math.min(b.length - bytesRead, buffer.capacity()); + ensureAvailable(toRead); + buffer.get(b, bytesRead, toRead); + bytesRead += toRead; + } + return b; } - + private String readIntsToString() throws IOException { int len = readInt(); if (len < 0) {