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