< prev index next >
src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 29,38 ****
--- 29,39 ----
import com.sun.hotspot.igv.data.services.GroupCallback;
import java.io.EOFException;
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;
import javax.swing.SwingUtilities;
import java.security.MessageDigest;
*** 66,75 ****
--- 67,78 ----
private static final int PROPERTY_ARRAY = 0x07;
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;
private final ByteBuffer buffer;
private final ReadableByteChannel channel;
private final GraphDocument rootDocument;
*** 273,304 ****
this.rootDocument = rootDocument;
folderStack = new LinkedList<>();
hashStack = new LinkedList<>();
this.monitor = monitor;
try {
! this.digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
}
}
private void fill() throws IOException {
buffer.compact();
if (channel.read(buffer) < 0) {
throw new EOFException();
}
buffer.flip();
}
private void ensureAvailable(int i) throws IOException {
while (buffer.remaining() < i) {
fill();
}
- buffer.mark();
- byte[] result = new byte[i];
- buffer.get(result);
- digest.update(result);
- buffer.reset();
}
private int readByte() throws IOException {
ensureAvailable(1);
return ((int)buffer.get()) & 0xff;
--- 276,315 ----
this.rootDocument = rootDocument;
folderStack = new LinkedList<>();
hashStack = new LinkedList<>();
this.monitor = monitor;
try {
! this.digest = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
}
}
private void fill() throws IOException {
+ // All the data between lastPosition and position has been
+ // used so add it to the digest.
+ int position = buffer.position();
+ buffer.position(lastPosition);
+ byte[] remaining = new byte[position - buffer.position()];
+ buffer.get(remaining);
+ digest.update(remaining);
+ assert position == buffer.position();
+
buffer.compact();
if (channel.read(buffer) < 0) {
throw new EOFException();
}
buffer.flip();
+ lastPosition = buffer.position();
}
private void ensureAvailable(int i) throws IOException {
+ if (i > buffer.capacity()) {
+ throw new IllegalArgumentException(String.format("Can not request %d bytes: buffer capacity is %d", i, buffer.capacity()));
+ }
while (buffer.remaining() < i) {
fill();
}
}
private int readByte() throws IOException {
ensureAvailable(1);
return ((int)buffer.get()) & 0xff;
*** 328,354 ****
ensureAvailable(4);
return buffer.getFloat();
}
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();
}
private byte[] readBytes() throws IOException {
int len = readInt();
if (len < 0) {
return null;
}
! ensureAvailable(len);
! byte[] data = new byte[len];
! buffer.get(data);
! return data;
}
private String readIntsToString() throws IOException {
int len = readInt();
if (len < 0) {
--- 339,365 ----
ensureAvailable(4);
return buffer.getFloat();
}
private String readString() throws IOException {
! return new String(readBytes(), utf8).intern();
}
private byte[] readBytes() throws IOException {
int len = readInt();
if (len < 0) {
return null;
}
! 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) {
*** 641,665 ****
--- 652,689 ----
}
Method method = readPoolObject(Method.class);
int bci = readInt();
Group group = new Group(parent);
group.getProperties().setProperty("name", name);
+ parseProperties(group.getProperties());
if (method != null) {
InputMethod inMethod = new InputMethod(group, method.name, shortName, bci);
inMethod.setBytecodes("TODO");
group.setMethod(inMethod);
}
return group;
}
+ int lastPosition = 0;
+
private InputGraph parseGraph() throws IOException {
if (monitor != null) {
monitor.updateProgress();
}
String title = readPoolObject(String.class);
digest.reset();
+ lastPosition = buffer.position();
InputGraph graph = parseGraph(title);
+
+ int position = buffer.position();
+ buffer.position(lastPosition);
+ byte[] remaining = new byte[position - buffer.position()];
+ buffer.get(remaining);
+ digest.update(remaining);
+ assert position == buffer.position();
+ lastPosition = buffer.position();
+
byte[] d = digest.digest();
byte[] hash = hashStack.peek();
if (hash != null && Arrays.equals(hash, d)) {
graph.getProperties().setProperty("_isDuplicate", "true");
} else {
*** 667,681 ****
--- 691,718 ----
hashStack.push(d);
}
return graph;
}
+ private void parseProperties(Properties properties) throws IOException {
+ int propCount = readShort();
+ for (int j = 0; j < propCount; j++) {
+ String key = readPoolObject(String.class);
+ Object value = readPropertyObject();
+ properties.setProperty(key, value != null ? value.toString() : "null");
+ }
+ }
+
private InputGraph parseGraph(String title) throws IOException {
InputGraph graph = new InputGraph(title);
+ parseProperties(graph.getProperties());
parseNodes(graph);
parseBlocks(graph);
graph.ensureNodesInBlocks();
+ for (InputNode node : graph.getNodes()) {
+ node.internProperties();
+ }
return graph;
}
private void parseBlocks(InputGraph graph) throws IOException {
int blockCount = readInt();
*** 820,832 ****
char toIndex = e.num;
graph.addEdge(InputEdge.createImmutable(fromIndex, toIndex, e.from, e.to, e.label, e.type));
}
}
private String createName(List<Edge> edges, Map<String, Object> properties, String template) {
! Pattern p = Pattern.compile("\\{(p|i)#([a-zA-Z0-9$_]+)(/(l|m|s))?\\}");
! Matcher m = p.matcher(template);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String name = m.group(2);
String type = m.group(1);
String result;
--- 857,870 ----
char toIndex = e.num;
graph.addEdge(InputEdge.createImmutable(fromIndex, toIndex, e.from, e.to, e.label, e.type));
}
}
+ static final Pattern templatePattern = Pattern.compile("\\{(p|i)#([a-zA-Z0-9$_]+)(/(l|m|s))?\\}");
+
private String createName(List<Edge> edges, Map<String, Object> properties, String template) {
! Matcher m = templatePattern.matcher(template);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String name = m.group(2);
String type = m.group(1);
String result;
< prev index next >