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