< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphProtocol.java

Print this page

        

*** 50,59 **** --- 50,60 ---- private static final int POOL_NULL = 0x05; private static final int POOL_NODE_CLASS = 0x06; private static final int POOL_FIELD = 0x07; private static final int POOL_SIGNATURE = 0x08; private static final int POOL_NODE_SOURCE_POSITION = 0x09; + private static final int POOL_NODE = 0x0a; private static final int PROPERTY_POOL = 0x00; private static final int PROPERTY_INT = 0x01; private static final int PROPERTY_LONG = 0x02; private static final int PROPERTY_DOUBLE = 0x03;
*** 69,100 **** private static final byte[] MAGIC_BYTES = {'B', 'I', 'G', 'V'}; private final ConstantPool constantPool; private final ByteBuffer buffer; private final WritableByteChannel channel; ! private final int versionMajor; ! private final int versionMinor; ! protected GraphProtocol(WritableByteChannel channel) throws IOException { ! this(channel, 4, 0); ! } ! ! private GraphProtocol(WritableByteChannel channel, int major, int minor) throws IOException { ! if (major > 4) { ! throw new IllegalArgumentException(); ! } ! if (major == 4 && minor > 0) { ! throw new IllegalArgumentException(); } this.versionMajor = major; this.versionMinor = minor; this.constantPool = new ConstantPool(); this.buffer = ByteBuffer.allocateDirect(256 * 1024); this.channel = channel; writeVersion(); } @SuppressWarnings("all") public final void print(Graph graph, Map<? extends Object, ? extends Object> properties, int id, String format, Object... args) throws IOException { writeByte(BEGIN_GRAPH); if (versionMajor >= 3) { writeInt(id); --- 70,102 ---- private static final byte[] MAGIC_BYTES = {'B', 'I', 'G', 'V'}; private final ConstantPool constantPool; private final ByteBuffer buffer; private final WritableByteChannel channel; ! final int versionMajor; ! final int versionMinor; ! GraphProtocol(WritableByteChannel channel, int major, int minor) throws IOException { ! if (major > 5 || (major == 5 && minor > 0)) { ! throw new IllegalArgumentException("Unrecognized version " + major + "." + minor); } this.versionMajor = major; this.versionMinor = minor; this.constantPool = new ConstantPool(); this.buffer = ByteBuffer.allocateDirect(256 * 1024); this.channel = channel; writeVersion(); } + GraphProtocol(GraphProtocol<?, ?, ?, ?, ?, ?, ?, ?, ?> parent) { + this.versionMajor = parent.versionMajor; + this.versionMinor = parent.versionMinor; + this.constantPool = parent.constantPool; + this.buffer = parent.buffer; + this.channel = parent.channel; + } + @SuppressWarnings("all") public final void print(Graph graph, Map<? extends Object, ? extends Object> properties, int id, String format, Object... args) throws IOException { writeByte(BEGIN_GRAPH); if (versionMajor >= 3) { writeInt(id);
*** 135,147 **** --- 137,173 ---- protected abstract Graph findGraph(Graph current, Object obj); protected abstract ResolvedJavaMethod findMethod(Object obj); + /** + * Attempts to recognize the provided object as a node. Used to encode it with + * {@link #POOL_NODE} pool type. + * + * @param obj any object + * @return <code>null</code> if it is not a node object, non-null otherwise + */ + protected abstract Node findNode(Object obj); + + /** + * Determines whether the provided object is node class or not. + * + * @param obj object to check + * @return {@code null} if {@code obj} does not represent a NodeClass otherwise the NodeClass + * represented by {@code obj} + */ protected abstract NodeClass findNodeClass(Object obj); /** + * Returns the NodeClass for a given Node {@code obj}. + * + * @param obj instance of node + * @return non-{@code null} instance of the node's class object + */ + protected abstract NodeClass findClassForNode(Node obj); + + /** * Find a Java class. The returned object must be acceptable by * {@link #findJavaTypeName(java.lang.Object)} and return valid name for the class. * * @param clazz node class object * @return object representing the class, for example {@link Class}
*** 237,247 **** } private void flush() throws IOException { buffer.flip(); /* ! * Try not to let interrupted threads aborting the write. There's still a race here but an * interrupt that's been pending for a long time shouldn't stop this writing. */ boolean interrupted = Thread.interrupted(); try { channel.write(buffer); --- 263,273 ---- } private void flush() throws IOException { buffer.flip(); /* ! * Try not to let interrupted threads abort the write. There's still a race here but an * interrupt that's been pending for a long time shouldn't stop this writing. */ boolean interrupted = Thread.interrupted(); try { channel.write(buffer);
*** 336,373 **** buffer.asDoubleBuffer().put(b); buffer.position(buffer.position() + sizeInBytes); } } ! private void writePoolObject(Object object) throws IOException { if (object == null) { writeByte(POOL_NULL); return; } Character id = constantPool.get(object); if (id == null) { addPoolEntry(object); } else { ! if (object instanceof Enum<?> || findEnumOrdinal(object) >= 0) { ! writeByte(POOL_ENUM); ! } else if (object instanceof Class<?> || findJavaTypeName(object) != null) { ! writeByte(POOL_CLASS); ! } else if (findJavaField(object) != null) { writeByte(POOL_FIELD); } else if (findSignature(object) != null) { writeByte(POOL_SIGNATURE); } else if (versionMajor >= 4 && findNodeSourcePosition(object) != null) { writeByte(POOL_NODE_SOURCE_POSITION); } else { if (findNodeClass(object) != null) { writeByte(POOL_NODE_CLASS); } else if (findMethod(object) != null) { writeByte(POOL_METHOD); } else { writeByte(POOL_STRING); } } writeShort(id.charValue()); } } private void writeGraph(Graph graph, Map<? extends Object, ? extends Object> properties) throws IOException { --- 362,408 ---- buffer.asDoubleBuffer().put(b); buffer.position(buffer.position() + sizeInBytes); } } ! private void writePoolObject(Object obj) throws IOException { ! Object object = obj; if (object == null) { writeByte(POOL_NULL); return; } Character id = constantPool.get(object); if (id == null) { addPoolEntry(object); } else { ! if (findJavaField(object) != null) { writeByte(POOL_FIELD); } else if (findSignature(object) != null) { writeByte(POOL_SIGNATURE); } else if (versionMajor >= 4 && findNodeSourcePosition(object) != null) { writeByte(POOL_NODE_SOURCE_POSITION); } else { + final Node node = findNode(object); + if (versionMajor == 4 && node != null) { + object = classForNode(node); + } if (findNodeClass(object) != null) { writeByte(POOL_NODE_CLASS); + } else if (versionMajor >= 5 && node != null) { + writeByte(POOL_NODE); } else if (findMethod(object) != null) { writeByte(POOL_METHOD); } else { + if (object instanceof Enum<?> || findEnumOrdinal(object) >= 0) { + writeByte(POOL_ENUM); + } else if (object instanceof Class<?> || findJavaTypeName(object) != null) { + writeByte(POOL_CLASS); + } else { writeByte(POOL_STRING); } } + } writeShort(id.charValue()); } } private void writeGraph(Graph graph, Map<? extends Object, ? extends Object> properties) throws IOException {
*** 381,394 **** final int size = findNodesCount(info); writeInt(size); int cnt = 0; for (Node node : findNodes(info)) { ! NodeClass nodeClass = findNodeClass(node); ! if (nodeClass == null) { ! throw new IOException("No class for " + node); ! } findNodeProperties(node, props, info); writeInt(findNodeId(node)); writePoolObject(nodeClass); writeByte(hasPredecessor(node) ? 1 : 0); --- 416,426 ---- final int size = findNodesCount(info); writeInt(size); int cnt = 0; for (Node node : findNodes(info)) { ! NodeClass nodeClass = classForNode(node); findNodeProperties(node, props, info); writeInt(findNodeId(node)); writePoolObject(nodeClass); writeByte(hasPredecessor(node) ? 1 : 0);
*** 403,413 **** throw new IOException("Expecting " + size + " nodes, but found " + cnt); } } private void writeEdges(Graph graph, Node node, boolean dumpInputs) throws IOException { ! NodeClass clazz = findNodeClass(node); Edges edges = findClassEdges(clazz, dumpInputs); int size = findSize(edges); for (int i = 0; i < size; i++) { Collection<? extends Node> list = findNodes(graph, node, edges, i); if (isDirect(edges, i)) { --- 435,445 ---- throw new IOException("Expecting " + size + " nodes, but found " + cnt); } } private void writeEdges(Graph graph, Node node, boolean dumpInputs) throws IOException { ! NodeClass clazz = classForNode(node); Edges edges = findClassEdges(clazz, dumpInputs); int size = findSize(edges); for (int i = 0; i < size; i++) { Collection<? extends Node> list = findNodes(graph, node, edges, i); if (isDirect(edges, i)) {
*** 432,441 **** --- 464,481 ---- } } } } + private NodeClass classForNode(Node node) throws IOException { + NodeClass clazz = findClassForNode(node); + if (clazz == null) { + throw new IOException("No class for " + node); + } + return clazz; + } + private void writeNodeRef(Node node) throws IOException { writeInt(findNodeId(node)); } private void writeBlocks(Collection<? extends Block> blocks, Graph info) throws IOException {
*** 478,514 **** } } } @SuppressWarnings("all") ! private void addPoolEntry(Object object) throws IOException { ResolvedJavaField field; String typeName; Signature signature; NodeSourcePosition pos; int enumOrdinal; char index = constantPool.add(object); writeByte(POOL_NEW); writeShort(index); ! if ((typeName = findJavaTypeName(object)) != null) { ! writeByte(POOL_CLASS); ! writeString(typeName); ! String[] enumValueNames = findEnumTypeValues(object); ! if (enumValueNames != null) { ! writeByte(ENUM_KLASS); ! writeInt(enumValueNames.length); ! for (String o : enumValueNames) { ! writePoolObject(o); ! } ! } else { ! writeByte(KLASS); ! } ! } else if ((enumOrdinal = findEnumOrdinal(object)) >= 0) { ! writeByte(POOL_ENUM); ! writePoolObject(findEnumClass(object)); ! writeInt(enumOrdinal); ! } else if ((field = findJavaField(object)) != null) { writeByte(POOL_FIELD); writePoolObject(findFieldDeclaringClass(field)); writePoolObject(findFieldName(field)); writePoolObject(findFieldTypeName(field)); writeInt(findFieldModifiers(field)); --- 518,538 ---- } } } @SuppressWarnings("all") ! private void addPoolEntry(Object obj) throws IOException { ! Object object = obj; ResolvedJavaField field; String typeName; Signature signature; NodeSourcePosition pos; int enumOrdinal; char index = constantPool.add(object); writeByte(POOL_NEW); writeShort(index); ! if ((field = findJavaField(object)) != null) { writeByte(POOL_FIELD); writePoolObject(findFieldDeclaringClass(field)); writePoolObject(findFieldName(field)); writePoolObject(findFieldTypeName(field)); writeInt(findFieldModifiers(field));
*** 533,542 **** --- 557,578 ---- } else { writePoolObject(null); } writePoolObject(findNodeSourcePositionCaller(pos)); } else { + Node node = findNode(object); + if (node != null) { + if (versionMajor >= 5) { + writeByte(POOL_NODE); + writeInt(findNodeId(node)); + writePoolObject(classForNode(node)); + return; + } + if (versionMajor == 4) { + object = classForNode(node); + } + } NodeClass nodeClass = findNodeClass(object); if (nodeClass != null) { writeByte(POOL_NODE_CLASS); final Object clazz = findJavaClass(nodeClass); if (versionMajor >= 3) {
*** 551,562 **** --- 587,617 ---- writeEdgesInfo(nodeClass, false); return; } ResolvedJavaMethod method = findMethod(object); if (method == null) { + if ((typeName = findJavaTypeName(object)) != null) { + writeByte(POOL_CLASS); + writeString(typeName); + String[] enumValueNames = findEnumTypeValues(object); + if (enumValueNames != null) { + writeByte(ENUM_KLASS); + writeInt(enumValueNames.length); + for (String o : enumValueNames) { + writePoolObject(o); + } + } else { + writeByte(KLASS); + } + } else if ((enumOrdinal = findEnumOrdinal(object)) >= 0) { + writeByte(POOL_ENUM); + writePoolObject(findEnumClass(object)); + writeInt(enumOrdinal); + } else { writeByte(POOL_STRING); writeString(object.toString()); + } return; } writeByte(POOL_METHOD); writePoolObject(findMethodDeclaringClass(method)); writePoolObject(findMethodName(method));
< prev index next >