From c3151c951f5a77c1224b18e61231da11cc25325c Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Wed, 11 Oct 2023 13:50:56 +0200 Subject: [PATCH] ex3 done --- README.md | 14 +- compile-tests.sh | 6 + .../inf/sp/cfg/ControlFlowGraphBuilder.java | 143 ++++++++++++++++-- .../inf/sp/cfg/ControlFlowGraphRenderer.java | 63 +++++++- src/ch/usi/inf/sp/cfg/builder/CFGBuilder.java | 134 ---------------- src/ch/usi/inf/sp/cfg/builder/Edge.java | 6 - src/ch/usi/inf/sp/cfg/builder/JumpSource.java | 19 +++ test-output/.dot | 11 ++ test-output/all.pdf | Bin 0 -> 68527 bytes test-output/alloc2Of3dArrayMethod.dot | 11 ++ test-output/alloc2dArrayMethod.dot | 11 ++ test-output/allocAndInit2dArrayMethod.dot | 11 ++ test-output/allocAndInitIntArrayMethod.dot | 11 ++ test-output/allocAndInitObjectArrayMethod.dot | 11 ++ test-output/allocIncomplete2dArrayMethod.dot | 11 ++ test-output/allocIntArrayMethod.dot | 11 ++ test-output/allocObjectArrayMethod.dot | 11 ++ test-output/allocObjectMethod.dot | 11 ++ test-output/arrayLengthMethod.dot | 11 ++ test-output/arrayReadMethod.dot | 11 ++ test-output/arrayWriteMethod.dot | 11 ++ test-output/condMethod.dot | 18 +++ test-output/doWhileMethod.dot | 16 ++ test-output/doWhileTrue.dot | 11 ++ test-output/emptyMethod.dot | 11 ++ test-output/fieldReadMethod.dot | 11 ++ test-output/fieldWriteMethod.dot | 11 ++ test-output/forEachArrayMethod.dot | 18 +++ test-output/forEachCollectionMethod.dot | 18 +++ test-output/forEver.dot | 13 ++ test-output/forMethod.dot | 18 +++ test-output/forWithBreakMethod.dot | 23 +++ test-output/forWithContinueMethod.dot | 25 +++ test-output/ifElseMethod.dot | 18 +++ test-output/ifMethod.dot | 16 ++ test-output/instanceCallMethod.dot | 11 ++ test-output/instanceCallTarget.dot | 11 ++ test-output/interfaceCallMethod.dot | 11 ++ test-output/nestedFor.dot | 25 +++ test-output/nonShortCircuitMethod.dot | 31 ++++ test-output/privateInstanceCallMethod.dot | 11 ++ test-output/privateInstanceCallTarget.dot | 11 ++ test-output/shortCircuitMethod.dot | 20 +++ test-output/staticCallMethod.dot | 11 ++ test-output/staticCallTarget.dot | 11 ++ test-output/staticFieldReadMethod.dot | 11 ++ test-output/staticFieldWriteMethod.dot | 11 ++ test-output/switchMethod.dot | 24 +++ test-output/switchMethod2.dot | 24 +++ test-output/whileMethod.dot | 18 +++ test-output/whileTrueMethod.dot | 11 ++ 51 files changed, 842 insertions(+), 165 deletions(-) create mode 100755 compile-tests.sh delete mode 100644 src/ch/usi/inf/sp/cfg/builder/CFGBuilder.java delete mode 100644 src/ch/usi/inf/sp/cfg/builder/Edge.java create mode 100644 src/ch/usi/inf/sp/cfg/builder/JumpSource.java create mode 100644 test-output/all.pdf create mode 100644 test-output/alloc2Of3dArrayMethod.dot create mode 100644 test-output/alloc2dArrayMethod.dot create mode 100644 test-output/allocAndInit2dArrayMethod.dot create mode 100644 test-output/allocAndInitIntArrayMethod.dot create mode 100644 test-output/allocAndInitObjectArrayMethod.dot create mode 100644 test-output/allocIncomplete2dArrayMethod.dot create mode 100644 test-output/allocIntArrayMethod.dot create mode 100644 test-output/allocObjectArrayMethod.dot create mode 100644 test-output/allocObjectMethod.dot create mode 100644 test-output/arrayLengthMethod.dot create mode 100644 test-output/arrayReadMethod.dot create mode 100644 test-output/arrayWriteMethod.dot create mode 100644 test-output/condMethod.dot create mode 100644 test-output/doWhileMethod.dot create mode 100644 test-output/doWhileTrue.dot create mode 100644 test-output/emptyMethod.dot create mode 100644 test-output/fieldReadMethod.dot create mode 100644 test-output/fieldWriteMethod.dot create mode 100644 test-output/forEachArrayMethod.dot create mode 100644 test-output/forEachCollectionMethod.dot create mode 100644 test-output/forEver.dot create mode 100644 test-output/forMethod.dot create mode 100644 test-output/forWithBreakMethod.dot create mode 100644 test-output/forWithContinueMethod.dot create mode 100644 test-output/ifElseMethod.dot create mode 100644 test-output/ifMethod.dot create mode 100644 test-output/instanceCallMethod.dot create mode 100644 test-output/instanceCallTarget.dot create mode 100644 test-output/interfaceCallMethod.dot create mode 100644 test-output/nestedFor.dot create mode 100644 test-output/nonShortCircuitMethod.dot create mode 100644 test-output/privateInstanceCallMethod.dot create mode 100644 test-output/privateInstanceCallTarget.dot create mode 100644 test-output/shortCircuitMethod.dot create mode 100644 test-output/staticCallMethod.dot create mode 100644 test-output/staticCallTarget.dot create mode 100644 test-output/staticFieldReadMethod.dot create mode 100644 test-output/staticFieldWriteMethod.dot create mode 100644 test-output/switchMethod.dot create mode 100644 test-output/switchMethod2.dot create mode 100644 test-output/whileMethod.dot create mode 100644 test-output/whileTrueMethod.dot diff --git a/README.md b/README.md index 35a6e6d..5e392a7 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ Please complete this checklist (turn [ ] into [X]) before you submit: - [x] I completed the above Submission Info - [x] I built the project in IntelliJ (Build > Build Project) -- [ ] I implemented the ControlFlowGraphBuilder -- [ ] I implemented the ControlFlowGraphRenderer -- [ ] I wrote the source code myself and did not look at the source code of my class mates -- [ ] I ran all the JUnit tests and verified that they all pass -- [ ] I manually checked that my implementation is correct by doing this: - - [ ] I studied the test-input/ExampleClass.java source code - - [ ] I ran App to produce the dot files (in test-output/) +- [x] I implemented the ControlFlowGraphBuilder +- [x] I implemented the ControlFlowGraphRenderer +- [x] I wrote the source code myself and did not look at the source code of my class mates +- [x] I ran all the JUnit tests and verified that they all pass +- [x] I manually checked that my implementation is correct by doing this: + - [x] I studied the test-input/ExampleClass.java source code + - [x] I ran App to produce the dot files (in test-output/) - [ ] I ran dot to turn the dot files in test-output into a PDF - [ ] I manually verified that the PDF contains one page per method of ExampleClass - [ ] I manually verified that those CFGs correspond to the methods' source code diff --git a/compile-tests.sh b/compile-tests.sh new file mode 100755 index 0000000..1e8bbac --- /dev/null +++ b/compile-tests.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -eou pipefail + +cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" +cat test-output/*.dot | gvpack -u | dot -Tpdf > test-output/all.pdf diff --git a/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java b/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java index 2f3c190..9d040fd 100644 --- a/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java +++ b/src/ch/usi/inf/sp/cfg/ControlFlowGraphBuilder.java @@ -1,24 +1,139 @@ package ch.usi.inf.sp.cfg; +import ch.usi.inf.sp.bytecode.Disassembler; +import ch.usi.inf.sp.cfg.builder.JumpSource; +import ch.usi.inf.sp.cfg.builder.LookupSwitchInstructionNodeInfo; +import ch.usi.inf.sp.cfg.builder.MultiMap; +import ch.usi.inf.sp.cfg.builder.SwitchInstructionNodeInfo; +import ch.usi.inf.sp.cfg.builder.TableSwitchInstructionNodeInfo; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; + import java.util.*; -import ch.usi.inf.sp.bytecode.Disassembler; -import ch.usi.inf.sp.cfg.builder.CFGBuilder; -import ch.usi.inf.sp.cfg.builder.Edge; -import ch.usi.inf.sp.cfg.builder.MultiMap; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.JumpInsnNode; -import org.objectweb.asm.tree.LabelNode; -import org.objectweb.asm.tree.LookupSwitchInsnNode; -import org.objectweb.asm.tree.MethodNode; -import org.objectweb.asm.tree.TableSwitchInsnNode; +public final class ControlFlowGraphBuilder { + private static final String DEFAULT_LABEL = "default"; + private static final String TRUE_LABEL = "T"; + private final MultiMap labelToIncomingEdges = new MultiMap<>(); + private final List labels = new ArrayList<>(); + private final Map insnToBlock = new HashMap<>(); + private final ControlFlowGraph graph = new ControlFlowGraph(); + private final MethodNode method; + private BasicBlock currentBasicBlock; -public class ControlFlowGraphBuilder { + private ControlFlowGraphBuilder(MethodNode method) { + this.method = method; + setNewBasicBlock(0); + graph.addEntryEdge(currentBasicBlock); + } public static ControlFlowGraph createControlFlowGraph(final MethodNode method) { - return new CFGBuilder(method).create(); + return new ControlFlowGraphBuilder(method).create(); + } + + private void setNewBasicBlock(int id) { + currentBasicBlock = new BasicBlock(id); + graph.addNode(currentBasicBlock); + } + + public ControlFlowGraph create() { + // get the list of all instructions in that method + final InsnList instructions = method.instructions; + for (int i = 0; i < instructions.size(); i++) { + final AbstractInsnNode instruction = instructions.get(i); + + switch (instruction.getType()) { + case AbstractInsnNode.JUMP_INSN -> + labelToIncomingEdges.put(((JumpInsnNode) instruction).label, new JumpSource(instruction, TRUE_LABEL)); + case AbstractInsnNode.LOOKUPSWITCH_INSN -> + captureSwitchEdges(new LookupSwitchInstructionNodeInfo((LookupSwitchInsnNode) instruction)); + case AbstractInsnNode.TABLESWITCH_INSN -> + captureSwitchEdges(new TableSwitchInstructionNodeInfo((TableSwitchInsnNode) instruction)); + } + } + + for (int i = 0; i < instructions.size(); i++) { + final AbstractInsnNode instruction = instructions.get(i); + + currentBasicBlock.appendInstruction(Disassembler.disassembleInstruction(instruction, i, instructions)); + + if (isReturnInstruction(instruction)) { + graph.addExitEdge(currentBasicBlock); + } + + insnToBlock.put(instruction, currentBasicBlock); + + if (isInsnSignificantLabel(instruction)) { + labels.add((LabelNode) instruction); + } + + if (isEndOfBlock(instruction)) { + final BasicBlock previousBasicBlock = currentBasicBlock; + setNewBasicBlock(i + 1); + + // GOTO and SWITCH instructions do not have a fallthrough edge, otherwise add one + if (instruction.getOpcode() != Opcodes.GOTO + && instruction.getType() != AbstractInsnNode.LOOKUPSWITCH_INSN + && instruction.getType() != AbstractInsnNode.TABLESWITCH_INSN) { + graph.addFallthroughEdge(previousBasicBlock, currentBasicBlock); + } + } + } + + for (final LabelNode label : labels) { + final BasicBlock toBB = Objects.requireNonNull(insnToBlock.get(label)); + for (final JumpSource jumpSource : labelToIncomingEdges.getAll(label)) { + final BasicBlock fromBB = jumpSource.block(insnToBlock); + final ControlFlowEdge edge = jumpSource.edge(); + + graph.addEdge(edge); + graph.connect(fromBB, edge, toBB); + } + } + + return graph; + } + + private void captureSwitchEdges(final SwitchInstructionNodeInfo info) { + for (int j = 0; j < info.getCaseCount(); j++) { + final LabelNode label = info.getLabelForCase(j); + final String value = info.getKeyForCase(j); + labelToIncomingEdges.put(label, new JumpSource(info.getNode(), value)); + } + if (info.getDefaultCase() != null) { + labelToIncomingEdges.put(info.getDefaultCase(), new JumpSource(info.getNode(), DEFAULT_LABEL)); + } + } + + private boolean isInsnSignificantLabel(final AbstractInsnNode node) { + return node instanceof LabelNode && labelToIncomingEdges.containsKey((LabelNode) node); + } + + private boolean isReturnInstruction(final AbstractInsnNode instruction) { + final int opcode = instruction.getOpcode(); + return opcode == Opcodes.RETURN || + opcode == Opcodes.ARETURN || + opcode == Opcodes.LRETURN || + opcode == Opcodes.IRETURN || + opcode == Opcodes.FRETURN; + } + + private boolean isEndOfBlock(final AbstractInsnNode instruction) { + final AbstractInsnNode nextInsn = instruction.getNext(); + + if (nextInsn == null) { + return false; // cannot start another bb at the end of the method with 0 instructions + } + + final int type = instruction.getType(); + if (type == AbstractInsnNode.JUMP_INSN || + type == AbstractInsnNode.LOOKUPSWITCH_INSN || + type == AbstractInsnNode.TABLESWITCH_INSN) { + return true; // if we're branching or jumping after this instruction, we NEED to cut the current bb short + } + + // if the next instruction is a label some other bb may jump into then cut, otherwise continue + return isInsnSignificantLabel(nextInsn); } } diff --git a/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java b/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java index 4ec24b7..7ee2535 100644 --- a/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java +++ b/src/ch/usi/inf/sp/cfg/ControlFlowGraphRenderer.java @@ -1,11 +1,66 @@ package ch.usi.inf.sp.cfg; -public class ControlFlowGraphRenderer { +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; - public static String renderControlFlowGraph(final String label, final ControlFlowGraph cfg) { - //TODO - return null; +public class ControlFlowGraphRenderer { + private static final String INDENTATION = " "; + private final StringBuilder code = new StringBuilder(); + private int indentationLevel = 0; + + private static String nodeIdentifier(final BasicBlock bb) { + if (bb.getInEdges().isEmpty()) { + return "e"; + } else if (bb.getOutEdges().isEmpty()) { + return "x"; + } else { + return "bb" + bb.getId(); + } } + private static String nodeStyle(final BasicBlock bb) { + if (bb.getInEdges().isEmpty()) { + return "[shape=circle,label=\"e\"]"; + } else if (bb.getOutEdges().isEmpty()) { + return "[shape=circle,label=\"x\"]"; + } else { + return "[label=\"" + bb.getId() + "|{" + + StreamSupport.stream(bb.getInstructions().spliterator(), false) + .collect(Collectors.joining("|")) + + "}\"]"; + } + } + + public static String renderControlFlowGraph(final String label, final ControlFlowGraph cfg) { + return new ControlFlowGraphRenderer().render(label, cfg); + } + + private void line(String line) { + code.append(INDENTATION.repeat(indentationLevel)).append(line).append('\n'); + } + + private String render(final String label, final ControlFlowGraph graph) { + line("digraph " + label + " {"); + indentationLevel++; + line("label=\"" + label + "\";"); + code.append('\n'); + + line("node [shape=record]"); + for (final BasicBlock bb : graph.getNodes()) { + line(nodeIdentifier(bb) + " " + nodeStyle(bb)); + } + code.append('\n'); + + for (var e : graph.getEdges()) { + final String l = e.getLabel(); + final String suffix = l == null || l.isBlank() ? "" : (" [label=\"" + e.getLabel() + "\"]"); + + line(nodeIdentifier(e.getFrom()) + " -> " + nodeIdentifier(e.getTo()) + suffix); + } + indentationLevel--; + line("}"); + + return code.toString(); + } } diff --git a/src/ch/usi/inf/sp/cfg/builder/CFGBuilder.java b/src/ch/usi/inf/sp/cfg/builder/CFGBuilder.java deleted file mode 100644 index 7622b13..0000000 --- a/src/ch/usi/inf/sp/cfg/builder/CFGBuilder.java +++ /dev/null @@ -1,134 +0,0 @@ -package ch.usi.inf.sp.cfg.builder; - -import ch.usi.inf.sp.bytecode.Disassembler; -import ch.usi.inf.sp.cfg.BasicBlock; -import ch.usi.inf.sp.cfg.ControlFlowEdge; -import ch.usi.inf.sp.cfg.ControlFlowGraph; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.*; - -import java.util.*; - -public final class CFGBuilder { - private final MultiMap labelToIncomingEdges = new MultiMap<>(); - private final List labels = new ArrayList<>(); - private final Map insnToBlock = new HashMap<>(); - - private final ControlFlowGraph graph = new ControlFlowGraph(); - private final MethodNode method; - private BasicBlock currentBasicBlock; - - public CFGBuilder(MethodNode method) { - this.method = method; - setNewBasicBlock(0); - graph.addEntryEdge(currentBasicBlock); - } - - private void setNewBasicBlock(int id) { - currentBasicBlock = new BasicBlock(id); - graph.addNode(currentBasicBlock); - } - - public ControlFlowGraph create() { - // get the list of all instructions in that method - final InsnList instructions = method.instructions; - for (int i = 0; i < instructions.size(); i++) { - final AbstractInsnNode instruction = instructions.get(i); - - switch (instruction.getType()) { - case AbstractInsnNode.JUMP_INSN -> labelToIncomingEdges.put( - ((JumpInsnNode) instruction).label, - new Edge(instruction, "T") - ); - case AbstractInsnNode.LOOKUPSWITCH_INSN -> - captureSwitchEdges(new LookupSwitchInstructionNodeInfo((LookupSwitchInsnNode) instruction)); - case AbstractInsnNode.TABLESWITCH_INSN -> - captureSwitchEdges(new TableSwitchInstructionNodeInfo((TableSwitchInsnNode) instruction)); - } - } - - for (int i = 0; i < instructions.size(); i++) { - final AbstractInsnNode instruction = instructions.get(i); - - currentBasicBlock.appendInstruction(Disassembler.disassembleInstruction(instruction, i, instructions)); - - if (isReturnInstruction(instruction)) { - graph.addExitEdge(currentBasicBlock); - } - - insnToBlock.put(instruction, currentBasicBlock); - - if (isInsnSignificantLabel(instruction)) { - labels.add((LabelNode) instruction); - } - - if (isEndOfBlock(instruction)) { - final int nextI = i + 1; - - final BasicBlock previousBasicBlock = currentBasicBlock; - setNewBasicBlock(nextI); - - // Handle "implicit" edges from this basic block to the next one, or the exit node - if (instructions.get(nextI).getOpcode() != Opcodes.GOTO) { - graph.addFallthroughEdge(previousBasicBlock, currentBasicBlock); - } - } - } - - for (final LabelNode label : labels) { - final BasicBlock toBB = Objects.requireNonNull(insnToBlock.get(label)); - for (final ch.usi.inf.sp.cfg.builder.Edge incomingEdge : labelToIncomingEdges.getAll(label)) { - final BasicBlock fromBB = Objects.requireNonNull(insnToBlock.get(incomingEdge.instruction())); - - final ControlFlowEdge edge = new ControlFlowEdge(incomingEdge.condition()); - graph.addEdge(edge); - graph.connect(fromBB, edge, toBB); - } - } - - return graph; - } - - - private void captureSwitchEdges(final SwitchInstructionNodeInfo info) { - for (int j = 0; j < info.getCaseCount(); j++) { - final LabelNode label = info.getLabelForCase(j); - final String value = info.getKeyForCase(j); - labelToIncomingEdges.put(label, new Edge(info.getNode(), value)); - } - if (info.getDefaultCase() != null) { - labelToIncomingEdges.put(info.getDefaultCase(), new Edge(info.getNode(), "default")); - } - } - - private boolean isInsnSignificantLabel(final AbstractInsnNode node) { - return node instanceof LabelNode && labelToIncomingEdges.containsKey((LabelNode) node); - } - - private boolean isReturnInstruction(final AbstractInsnNode instruction) { - final int opcode = instruction.getOpcode(); - return opcode == Opcodes.RETURN || - opcode == Opcodes.ARETURN || - opcode == Opcodes.LRETURN || - opcode == Opcodes.IRETURN || - opcode == Opcodes.FRETURN; - } - - private boolean isEndOfBlock(final AbstractInsnNode instruction) { - final AbstractInsnNode nextInsn = instruction.getNext(); - - if (nextInsn == null) { - return false; // cannot start another bb at the end of the method with 0 instructions - } - - final int type = instruction.getType(); - if (type == AbstractInsnNode.JUMP_INSN || - type == AbstractInsnNode.LOOKUPSWITCH_INSN || - type == AbstractInsnNode.TABLESWITCH_INSN) { - return true; // if we're branching or jumping after this instruction, we NEED to cut the current bb short - } - - // if the next instruction is a label some other bb may jump into then cut, otherwise continue - return isInsnSignificantLabel(nextInsn); - } -} diff --git a/src/ch/usi/inf/sp/cfg/builder/Edge.java b/src/ch/usi/inf/sp/cfg/builder/Edge.java deleted file mode 100644 index 5602d66..0000000 --- a/src/ch/usi/inf/sp/cfg/builder/Edge.java +++ /dev/null @@ -1,6 +0,0 @@ -package ch.usi.inf.sp.cfg.builder; - -import org.objectweb.asm.tree.AbstractInsnNode; - -public record Edge(AbstractInsnNode instruction, String condition) { -} diff --git a/src/ch/usi/inf/sp/cfg/builder/JumpSource.java b/src/ch/usi/inf/sp/cfg/builder/JumpSource.java new file mode 100644 index 0000000..ad23ab4 --- /dev/null +++ b/src/ch/usi/inf/sp/cfg/builder/JumpSource.java @@ -0,0 +1,19 @@ +package ch.usi.inf.sp.cfg.builder; + +import ch.usi.inf.sp.cfg.BasicBlock; +import ch.usi.inf.sp.cfg.ControlFlowEdge; +import org.objectweb.asm.tree.AbstractInsnNode; + +import java.util.Map; +import java.util.Objects; + +public record JumpSource(AbstractInsnNode instruction, String condition) { + + public BasicBlock block(Map insnToBlock) { + return Objects.requireNonNull(insnToBlock.get(this.instruction)); + } + + public ControlFlowEdge edge() { + return new ControlFlowEdge(this.condition); + } +} diff --git a/test-output/.dot b/test-output/.dot index e69de29..767c1ca 100644 --- a/test-output/.dot +++ b/test-output/.dot @@ -0,0 +1,11 @@ +digraph { + label=""; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: INVOKESPECIAL java/lang/Object. ()V|4: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/all.pdf b/test-output/all.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84916711995265dc1f84a492869648aab257cc14 GIT binary patch literal 68527 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 YC@x7XDgmbmGjmH|drDQ+)!&T^0H?s|-T(jq literal 0 HcmV?d00001 diff --git a/test-output/alloc2Of3dArrayMethod.dot b/test-output/alloc2Of3dArrayMethod.dot new file mode 100644 index 0000000..671d54e --- /dev/null +++ b/test-output/alloc2Of3dArrayMethod.dot @@ -0,0 +1,11 @@ +digraph alloc2Of3dArrayMethod { + label="alloc2Of3dArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[[I 2|5: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/alloc2dArrayMethod.dot b/test-output/alloc2dArrayMethod.dot new file mode 100644 index 0000000..fd4494e --- /dev/null +++ b/test-output/alloc2dArrayMethod.dot @@ -0,0 +1,11 @@ +digraph alloc2dArrayMethod { + label="alloc2dArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[I 2|5: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocAndInit2dArrayMethod.dot b/test-output/allocAndInit2dArrayMethod.dot new file mode 100644 index 0000000..8eec586 --- /dev/null +++ b/test-output/allocAndInit2dArrayMethod.dot @@ -0,0 +1,11 @@ +digraph allocAndInit2dArrayMethod { + label="allocAndInit2dArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_1 |3: ANEWARRAY [I|4: DUP |5: ICONST_0 |6: ICONST_1 |7: NEWARRAY T_INT|8: DUP |9: ICONST_0 |10: ICONST_1 |11: IASTORE |12: AASTORE |13: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocAndInitIntArrayMethod.dot b/test-output/allocAndInitIntArrayMethod.dot new file mode 100644 index 0000000..7cff1b5 --- /dev/null +++ b/test-output/allocAndInitIntArrayMethod.dot @@ -0,0 +1,11 @@ +digraph allocAndInitIntArrayMethod { + label="allocAndInitIntArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: NEWARRAY T_INT|4: DUP |5: ICONST_0 |6: ICONST_1 |7: IASTORE |8: DUP |9: ICONST_1 |10: ICONST_2 |11: IASTORE |12: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocAndInitObjectArrayMethod.dot b/test-output/allocAndInitObjectArrayMethod.dot new file mode 100644 index 0000000..7e66631 --- /dev/null +++ b/test-output/allocAndInitObjectArrayMethod.dot @@ -0,0 +1,11 @@ +digraph allocAndInitObjectArrayMethod { + label="allocAndInitObjectArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY java/lang/Object|4: DUP |5: ICONST_0 |6: LDC 1|7: AASTORE |8: DUP |9: ICONST_1 |10: LDC 2|11: AASTORE |12: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocIncomplete2dArrayMethod.dot b/test-output/allocIncomplete2dArrayMethod.dot new file mode 100644 index 0000000..4be865e --- /dev/null +++ b/test-output/allocIncomplete2dArrayMethod.dot @@ -0,0 +1,11 @@ +digraph allocIncomplete2dArrayMethod { + label="allocIncomplete2dArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY [I|4: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocIntArrayMethod.dot b/test-output/allocIntArrayMethod.dot new file mode 100644 index 0000000..3870d39 --- /dev/null +++ b/test-output/allocIntArrayMethod.dot @@ -0,0 +1,11 @@ +digraph allocIntArrayMethod { + label="allocIntArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: NEWARRAY T_INT|4: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocObjectArrayMethod.dot b/test-output/allocObjectArrayMethod.dot new file mode 100644 index 0000000..4339049 --- /dev/null +++ b/test-output/allocObjectArrayMethod.dot @@ -0,0 +1,11 @@ +digraph allocObjectArrayMethod { + label="allocObjectArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: ANEWARRAY java/lang/Object|4: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/allocObjectMethod.dot b/test-output/allocObjectMethod.dot new file mode 100644 index 0000000..3362c01 --- /dev/null +++ b/test-output/allocObjectMethod.dot @@ -0,0 +1,11 @@ +digraph allocObjectMethod { + label="allocObjectMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: NEW java/lang/Object|3: DUP |4: INVOKESPECIAL java/lang/Object. ()V|5: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/arrayLengthMethod.dot b/test-output/arrayLengthMethod.dot new file mode 100644 index 0000000..db26714 --- /dev/null +++ b/test-output/arrayLengthMethod.dot @@ -0,0 +1,11 @@ +digraph arrayLengthMethod { + label="arrayLengthMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ARRAYLENGTH |4: IRETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/arrayReadMethod.dot b/test-output/arrayReadMethod.dot new file mode 100644 index 0000000..28fc7c6 --- /dev/null +++ b/test-output/arrayReadMethod.dot @@ -0,0 +1,11 @@ +digraph arrayReadMethod { + label="arrayReadMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: AALOAD |5: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/arrayWriteMethod.dot b/test-output/arrayWriteMethod.dot new file mode 100644 index 0000000..59de2a0 --- /dev/null +++ b/test-output/arrayWriteMethod.dot @@ -0,0 +1,11 @@ +digraph arrayWriteMethod { + label="arrayWriteMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: ALOAD 2|5: AASTORE |6: // label|7: // line number information|8: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/condMethod.dot b/test-output/condMethod.dot new file mode 100644 index 0000000..40ec62b --- /dev/null +++ b/test-output/condMethod.dot @@ -0,0 +1,18 @@ +digraph condMethod { + label="condMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"] + bb5 [label="5|{5: ILOAD 1|6: GOTO 10}"] + bb7 [label="7|{7: // label|8: // stack frame map|9: ILOAD 2}"] + bb10 [label="10|{10: // label|11: // stack frame map|12: IRETURN }"] + + e -> bb0 + bb0 -> bb5 + bb7 -> bb10 + bb10 -> x + bb0 -> bb7 [label="T"] + bb5 -> bb10 [label="T"] +} diff --git a/test-output/doWhileMethod.dot b/test-output/doWhileMethod.dot new file mode 100644 index 0000000..eefa2c0 --- /dev/null +++ b/test-output/doWhileMethod.dot @@ -0,0 +1,16 @@ +digraph doWhileMethod { + label="doWhileMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"] + bb4 [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 2|8: ILOAD 1|9: IADD |10: ISTORE 2|11: // label|12: // line number information|13: IINC 1 -1|14: // label|15: // line number information|16: ILOAD 1|17: IFGT 4}"] + bb18 [label="18|{18: // label|19: // line number information|20: ILOAD 2|21: IRETURN }"] + + e -> bb0 + bb0 -> bb4 + bb4 -> bb18 + bb18 -> x + bb4 -> bb4 [label="T"] +} diff --git a/test-output/doWhileTrue.dot b/test-output/doWhileTrue.dot new file mode 100644 index 0000000..91220c1 --- /dev/null +++ b/test-output/doWhileTrue.dot @@ -0,0 +1,11 @@ +digraph doWhileTrue { + label="doWhileTrue"; + + node [shape=record] + e [shape=circle,label="e"] + e [shape=circle,label="e"] + bb0 [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: // label|5: // line number information|6: GOTO 0}"] + + e -> bb0 + bb0 -> bb0 [label="T"] +} diff --git a/test-output/emptyMethod.dot b/test-output/emptyMethod.dot new file mode 100644 index 0000000..b85c7b2 --- /dev/null +++ b/test-output/emptyMethod.dot @@ -0,0 +1,11 @@ +digraph emptyMethod { + label="emptyMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/fieldReadMethod.dot b/test-output/fieldReadMethod.dot new file mode 100644 index 0000000..fbdde10 --- /dev/null +++ b/test-output/fieldReadMethod.dot @@ -0,0 +1,11 @@ +digraph fieldReadMethod { + label="fieldReadMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: GETFIELD ExampleClass.field Ljava/lang/String;|4: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/fieldWriteMethod.dot b/test-output/fieldWriteMethod.dot new file mode 100644 index 0000000..21da341 --- /dev/null +++ b/test-output/fieldWriteMethod.dot @@ -0,0 +1,11 @@ +digraph fieldWriteMethod { + label="fieldWriteMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: ALOAD 1|4: PUTFIELD ExampleClass.field Ljava/lang/String;|5: // label|6: // line number information|7: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/forEachArrayMethod.dot b/test-output/forEachArrayMethod.dot new file mode 100644 index 0000000..7cb1489 --- /dev/null +++ b/test-output/forEachArrayMethod.dot @@ -0,0 +1,18 @@ +digraph forEachArrayMethod { + label="forEachArrayMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: ASTORE 3|8: ALOAD 3|9: ARRAYLENGTH |10: ISTORE 4|11: ICONST_0 |12: ISTORE 5}"] + bb13 [label="13|{13: // label|14: // stack frame map|15: ILOAD 5|16: ILOAD 4|17: IF_ICMPGE 29}"] + bb18 [label="18|{18: ALOAD 3|19: ILOAD 5|20: AALOAD |21: ASTORE 6|22: // label|23: // line number information|24: IINC 2 1|25: // label|26: // line number information|27: IINC 5 1|28: GOTO 13}"] + bb29 [label="29|{29: // label|30: // line number information|31: // stack frame map|32: ILOAD 2|33: IRETURN }"] + + e -> bb0 + bb0 -> bb13 + bb13 -> bb18 + bb29 -> x + bb18 -> bb13 [label="T"] + bb13 -> bb29 [label="T"] +} diff --git a/test-output/forEachCollectionMethod.dot b/test-output/forEachCollectionMethod.dot new file mode 100644 index 0000000..cf91a87 --- /dev/null +++ b/test-output/forEachCollectionMethod.dot @@ -0,0 +1,18 @@ +digraph forEachCollectionMethod { + label="forEachCollectionMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;|8: ASTORE 3}"] + bb9 [label="9|{9: // label|10: // stack frame map|11: ALOAD 3|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z|13: IFEQ 24}"] + bb14 [label="14|{14: ALOAD 3|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;|16: CHECKCAST java/lang/String|17: ASTORE 4|18: // label|19: // line number information|20: IINC 2 1|21: // label|22: // line number information|23: GOTO 9}"] + bb24 [label="24|{24: // label|25: // line number information|26: // stack frame map|27: ILOAD 2|28: IRETURN }"] + + e -> bb0 + bb0 -> bb9 + bb9 -> bb14 + bb24 -> x + bb14 -> bb9 [label="T"] + bb9 -> bb24 [label="T"] +} diff --git a/test-output/forEver.dot b/test-output/forEver.dot new file mode 100644 index 0000000..e517f58 --- /dev/null +++ b/test-output/forEver.dot @@ -0,0 +1,13 @@ +digraph forEver { + label="forEver"; + + node [shape=record] + e [shape=circle,label="e"] + e [shape=circle,label="e"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"] + bb4 [label="4|{4: // label|5: // stack frame map|6: IINC 2 1|7: GOTO 4}"] + + e -> bb0 + bb0 -> bb4 + bb4 -> bb4 [label="T"] +} diff --git a/test-output/forMethod.dot b/test-output/forMethod.dot new file mode 100644 index 0000000..6233028 --- /dev/null +++ b/test-output/forMethod.dot @@ -0,0 +1,18 @@ +digraph forMethod { + label="forMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + bb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 23}"] + bb13 [label="13|{13: // label|14: // line number information|15: ILOAD 2|16: ILOAD 3|17: IADD |18: ISTORE 2|19: // label|20: // line number information|21: IINC 1 1|22: GOTO 8}"] + bb23 [label="23|{23: // label|24: // line number information|25: // stack frame map|26: ILOAD 2|27: IRETURN }"] + + e -> bb0 + bb0 -> bb8 + bb8 -> bb13 + bb23 -> x + bb13 -> bb8 [label="T"] + bb8 -> bb23 [label="T"] +} diff --git a/test-output/forWithBreakMethod.dot b/test-output/forWithBreakMethod.dot new file mode 100644 index 0000000..349f0ce --- /dev/null +++ b/test-output/forWithBreakMethod.dot @@ -0,0 +1,23 @@ +digraph forWithBreakMethod { + label="forWithBreakMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + bb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 32}"] + bb13 [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"] + bb18 [label="18|{18: // label|19: // line number information|20: GOTO 32}"] + bb21 [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2|28: // label|29: // line number information|30: IINC 3 1|31: GOTO 8}"] + bb32 [label="32|{32: // label|33: // line number information|34: // stack frame map|35: ILOAD 2|36: IRETURN }"] + + e -> bb0 + bb0 -> bb8 + bb8 -> bb13 + bb13 -> bb18 + bb32 -> x + bb21 -> bb8 [label="T"] + bb13 -> bb21 [label="T"] + bb8 -> bb32 [label="T"] + bb18 -> bb32 [label="T"] +} diff --git a/test-output/forWithContinueMethod.dot b/test-output/forWithContinueMethod.dot new file mode 100644 index 0000000..245949a --- /dev/null +++ b/test-output/forWithContinueMethod.dot @@ -0,0 +1,25 @@ +digraph forWithContinueMethod { + label="forWithContinueMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + bb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 33}"] + bb13 [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"] + bb18 [label="18|{18: // label|19: // line number information|20: GOTO 28}"] + bb21 [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2}"] + bb28 [label="28|{28: // label|29: // line number information|30: // stack frame map|31: IINC 3 1|32: GOTO 8}"] + bb33 [label="33|{33: // label|34: // line number information|35: // stack frame map|36: ILOAD 2|37: IRETURN }"] + + e -> bb0 + bb0 -> bb8 + bb8 -> bb13 + bb13 -> bb18 + bb21 -> bb28 + bb33 -> x + bb28 -> bb8 [label="T"] + bb13 -> bb21 [label="T"] + bb18 -> bb28 [label="T"] + bb8 -> bb33 [label="T"] +} diff --git a/test-output/ifElseMethod.dot b/test-output/ifElseMethod.dot new file mode 100644 index 0000000..2385f04 --- /dev/null +++ b/test-output/ifElseMethod.dot @@ -0,0 +1,18 @@ +digraph ifElseMethod { + label="ifElseMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: IFLE 13}"] + bb8 [label="8|{8: // label|9: // line number information|10: ICONST_0 |11: ISTORE 2|12: GOTO 18}"] + bb13 [label="13|{13: // label|14: // line number information|15: // stack frame map|16: ILOAD 1|17: ISTORE 2}"] + bb18 [label="18|{18: // label|19: // line number information|20: // stack frame map|21: ILOAD 2|22: IRETURN }"] + + e -> bb0 + bb0 -> bb8 + bb13 -> bb18 + bb18 -> x + bb0 -> bb13 [label="T"] + bb8 -> bb18 [label="T"] +} diff --git a/test-output/ifMethod.dot b/test-output/ifMethod.dot new file mode 100644 index 0000000..40e0e82 --- /dev/null +++ b/test-output/ifMethod.dot @@ -0,0 +1,16 @@ +digraph ifMethod { + label="ifMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: IFGE 12}"] + bb8 [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: ISTORE 2}"] + bb12 [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ILOAD 2|16: IRETURN }"] + + e -> bb0 + bb0 -> bb8 + bb8 -> bb12 + bb12 -> x + bb0 -> bb12 [label="T"] +} diff --git a/test-output/instanceCallMethod.dot b/test-output/instanceCallMethod.dot new file mode 100644 index 0000000..3d534f2 --- /dev/null +++ b/test-output/instanceCallMethod.dot @@ -0,0 +1,11 @@ +digraph instanceCallMethod { + label="instanceCallMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/instanceCallTarget.dot b/test-output/instanceCallTarget.dot new file mode 100644 index 0000000..b190488 --- /dev/null +++ b/test-output/instanceCallTarget.dot @@ -0,0 +1,11 @@ +digraph instanceCallTarget { + label="instanceCallTarget"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/interfaceCallMethod.dot b/test-output/interfaceCallMethod.dot new file mode 100644 index 0000000..ea008b2 --- /dev/null +++ b/test-output/interfaceCallMethod.dot @@ -0,0 +1,11 @@ +digraph interfaceCallMethod { + label="interfaceCallMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/nestedFor.dot b/test-output/nestedFor.dot new file mode 100644 index 0000000..44fc2d3 --- /dev/null +++ b/test-output/nestedFor.dot @@ -0,0 +1,25 @@ +digraph nestedFor { + label="nestedFor"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"] + bb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 37}"] + bb13 [label="13|{13: // label|14: // line number information|15: ICONST_0 |16: ISTORE 4}"] + bb17 [label="17|{17: // label|18: // stack frame map|19: ILOAD 4|20: ILOAD 3|21: IF_ICMPGE 32}"] + bb22 [label="22|{22: // label|23: // line number information|24: ILOAD 2|25: ILOAD 4|26: IADD |27: ISTORE 2|28: // label|29: // line number information|30: IINC 4 1|31: GOTO 17}"] + bb32 [label="32|{32: // label|33: // line number information|34: // stack frame map|35: IINC 3 1|36: GOTO 8}"] + bb37 [label="37|{37: // label|38: // line number information|39: // stack frame map|40: ILOAD 2|41: IRETURN }"] + + e -> bb0 + bb0 -> bb8 + bb8 -> bb13 + bb13 -> bb17 + bb17 -> bb22 + bb37 -> x + bb32 -> bb8 [label="T"] + bb22 -> bb17 [label="T"] + bb17 -> bb32 [label="T"] + bb8 -> bb37 [label="T"] +} diff --git a/test-output/nonShortCircuitMethod.dot b/test-output/nonShortCircuitMethod.dot new file mode 100644 index 0000000..cc42448 --- /dev/null +++ b/test-output/nonShortCircuitMethod.dot @@ -0,0 +1,31 @@ +digraph nonShortCircuitMethod { + label="nonShortCircuitMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"] + bb5 [label="5|{5: ICONST_1 |6: GOTO 10}"] + bb7 [label="7|{7: // label|8: // stack frame map|9: ICONST_0 }"] + bb10 [label="10|{10: // label|11: // stack frame map|12: ILOAD 1|13: ILOAD 3|14: IF_ICMPGE 17}"] + bb15 [label="15|{15: ICONST_1 |16: GOTO 20}"] + bb17 [label="17|{17: // label|18: // stack frame map|19: ICONST_0 }"] + bb20 [label="20|{20: // label|21: // stack frame map|22: IAND |23: IFEQ 28}"] + bb24 [label="24|{24: // label|25: // line number information|26: ICONST_1 |27: IRETURN }"] + bb28 [label="28|{28: // label|29: // line number information|30: // stack frame map|31: ICONST_0 |32: IRETURN }"] + + e -> bb0 + bb0 -> bb5 + bb7 -> bb10 + bb10 -> bb15 + bb17 -> bb20 + bb20 -> bb24 + bb24 -> x + bb24 -> bb28 + bb28 -> x + bb0 -> bb7 [label="T"] + bb5 -> bb10 [label="T"] + bb10 -> bb17 [label="T"] + bb15 -> bb20 [label="T"] + bb20 -> bb28 [label="T"] +} diff --git a/test-output/privateInstanceCallMethod.dot b/test-output/privateInstanceCallMethod.dot new file mode 100644 index 0000000..a02673c --- /dev/null +++ b/test-output/privateInstanceCallMethod.dot @@ -0,0 +1,11 @@ +digraph privateInstanceCallMethod { + label="privateInstanceCallMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/privateInstanceCallTarget.dot b/test-output/privateInstanceCallTarget.dot new file mode 100644 index 0000000..058ef84 --- /dev/null +++ b/test-output/privateInstanceCallTarget.dot @@ -0,0 +1,11 @@ +digraph privateInstanceCallTarget { + label="privateInstanceCallTarget"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/shortCircuitMethod.dot b/test-output/shortCircuitMethod.dot new file mode 100644 index 0000000..3d84edb --- /dev/null +++ b/test-output/shortCircuitMethod.dot @@ -0,0 +1,20 @@ +digraph shortCircuitMethod { + label="shortCircuitMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 12}"] + bb5 [label="5|{5: ILOAD 1|6: ILOAD 3|7: IF_ICMPGE 12}"] + bb8 [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: IRETURN }"] + bb12 [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ICONST_0 |16: IRETURN }"] + + e -> bb0 + bb0 -> bb5 + bb5 -> bb8 + bb8 -> x + bb8 -> bb12 + bb12 -> x + bb0 -> bb12 [label="T"] + bb5 -> bb12 [label="T"] +} diff --git a/test-output/staticCallMethod.dot b/test-output/staticCallMethod.dot new file mode 100644 index 0000000..b004502 --- /dev/null +++ b/test-output/staticCallMethod.dot @@ -0,0 +1,11 @@ +digraph staticCallMethod { + label="staticCallMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: INVOKESTATIC ExampleClass.staticCallTarget ()V|3: // label|4: // line number information|5: ICONST_2 |6: IRETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/staticCallTarget.dot b/test-output/staticCallTarget.dot new file mode 100644 index 0000000..a2beb0e --- /dev/null +++ b/test-output/staticCallTarget.dot @@ -0,0 +1,11 @@ +digraph staticCallTarget { + label="staticCallTarget"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/staticFieldReadMethod.dot b/test-output/staticFieldReadMethod.dot new file mode 100644 index 0000000..c175b80 --- /dev/null +++ b/test-output/staticFieldReadMethod.dot @@ -0,0 +1,11 @@ +digraph staticFieldReadMethod { + label="staticFieldReadMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;|3: ARETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/staticFieldWriteMethod.dot b/test-output/staticFieldWriteMethod.dot new file mode 100644 index 0000000..6a99e8c --- /dev/null +++ b/test-output/staticFieldWriteMethod.dot @@ -0,0 +1,11 @@ +digraph staticFieldWriteMethod { + label="staticFieldWriteMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;|4: // label|5: // line number information|6: RETURN }"] + + e -> bb0 + bb0 -> x +} diff --git a/test-output/switchMethod.dot b/test-output/switchMethod.dot new file mode 100644 index 0000000..eb4d363 --- /dev/null +++ b/test-output/switchMethod.dot @@ -0,0 +1,24 @@ +digraph switchMethod { + label="switchMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26}"] + bb8 [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"] + bb14 [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"] + bb20 [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"] + bb26 [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"] + bb31 [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"] + + e -> bb0 + bb26 -> bb31 + bb31 -> x + bb0 -> bb8 [label="0"] + bb0 -> bb14 [label="1"] + bb0 -> bb20 [label="2"] + bb0 -> bb26 [label="default"] + bb8 -> bb31 [label="T"] + bb14 -> bb31 [label="T"] + bb20 -> bb31 [label="T"] +} diff --git a/test-output/switchMethod2.dot b/test-output/switchMethod2.dot new file mode 100644 index 0000000..1565c59 --- /dev/null +++ b/test-output/switchMethod2.dot @@ -0,0 +1,24 @@ +digraph switchMethod2 { + label="switchMethod2"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26}"] + bb8 [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"] + bb14 [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"] + bb20 [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"] + bb26 [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"] + bb31 [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"] + + e -> bb0 + bb26 -> bb31 + bb31 -> x + bb0 -> bb8 [label="0"] + bb0 -> bb14 [label="1000"] + bb0 -> bb20 [label="2000"] + bb0 -> bb26 [label="default"] + bb8 -> bb31 [label="T"] + bb14 -> bb31 [label="T"] + bb20 -> bb31 [label="T"] +} diff --git a/test-output/whileMethod.dot b/test-output/whileMethod.dot new file mode 100644 index 0000000..832221b --- /dev/null +++ b/test-output/whileMethod.dot @@ -0,0 +1,18 @@ +digraph whileMethod { + label="whileMethod"; + + node [shape=record] + e [shape=circle,label="e"] + x [shape=circle,label="x"] + bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"] + bb4 [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 1|8: IFLE 19}"] + bb9 [label="9|{9: // label|10: // line number information|11: ILOAD 2|12: ILOAD 1|13: IADD |14: ISTORE 2|15: // label|16: // line number information|17: IINC 1 -1|18: GOTO 4}"] + bb19 [label="19|{19: // label|20: // line number information|21: // stack frame map|22: ILOAD 2|23: IRETURN }"] + + e -> bb0 + bb0 -> bb4 + bb4 -> bb9 + bb19 -> x + bb9 -> bb4 [label="T"] + bb4 -> bb19 [label="T"] +} diff --git a/test-output/whileTrueMethod.dot b/test-output/whileTrueMethod.dot new file mode 100644 index 0000000..f0fb500 --- /dev/null +++ b/test-output/whileTrueMethod.dot @@ -0,0 +1,11 @@ +digraph whileTrueMethod { + label="whileTrueMethod"; + + node [shape=record] + e [shape=circle,label="e"] + e [shape=circle,label="e"] + bb0 [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: GOTO 0}"] + + e -> bb0 + bb0 -> bb0 [label="T"] +}