diff options
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core/internal')
3 files changed, 59 insertions, 3 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java index 08176dfd..157416ad 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java @@ -54,6 +54,11 @@ public final class LabelFlowAnalyzer extends MethodVisitor { boolean first = true; /** + * Label instance of the last line start. + */ + Label lineStart = null; + + /** * Create new instance. */ public LabelFlowAnalyzer() { @@ -94,6 +99,11 @@ public final class LabelFlowAnalyzer extends MethodVisitor { } @Override + public void visitLineNumber(final int line, final Label start) { + lineStart = start; + } + + @Override public void visitTableSwitchInsn(final int min, final int max, final Label dflt, final Label... labels) { visitSwitchInsn(dflt, labels); @@ -174,6 +184,7 @@ public final class LabelFlowAnalyzer extends MethodVisitor { final String name, final String desc, final boolean itf) { successor = true; first = false; + markMethodInvocationLine(); } @Override @@ -181,6 +192,13 @@ public final class LabelFlowAnalyzer extends MethodVisitor { final Handle bsm, final Object... bsmArgs) { successor = true; first = false; + markMethodInvocationLine(); + } + + private void markMethodInvocationLine() { + if (lineStart != null) { + LabelInfo.setMethodInvocationLine(lineStart); + } } @Override diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java index 956761da..c6f1b763 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java @@ -31,6 +31,8 @@ public final class LabelInfo { private boolean successor = false; + private boolean methodInvocationLine = false; + private boolean done = false; private int probeid = NO_PROBE; @@ -105,6 +107,43 @@ public final class LabelInfo { } /** + * Mark a given label as the beginning of a line with method invocations. + * + * @param label + * label to mark + */ + public static void setMethodInvocationLine(final Label label) { + create(label).methodInvocationLine = true; + } + + /** + * Checks whether the a given label has been marked as a line with method + * invocations. + * + * @param label + * label to check + * @return <code>true</code> if the label represents a line with method + * invocations + */ + public static boolean isMethodInvocationLine(final Label label) { + final LabelInfo info = get(label); + return info == null ? false : info.methodInvocationLine; + } + + /** + * Determines whether the given label needs a probe to be inserted before. + * + * @param label + * label to test + * @return <code>true</code> if a probe should be inserted before + */ + public static boolean needsProbe(final Label label) { + final LabelInfo info = get(label); + return info != null && info.successor + && (info.multiTarget || info.methodInvocationLine); + } + + /** * Mark a given label as done. * * @param label diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java index 32ef9f10..5081fffc 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java @@ -68,8 +68,7 @@ public final class MethodProbesAdapter extends MethodVisitor { // a different label for the try-catch block. if (tryCatchProbeLabels.containsKey(start)) { start = tryCatchProbeLabels.get(start); - } else if (LabelInfo.isMultiTarget(start) - && LabelInfo.isSuccessor(start)) { + } else if (LabelInfo.needsProbe(start)) { final Label probeLabel = new Label(); LabelInfo.setSuccessor(probeLabel); tryCatchProbeLabels.put(start, probeLabel); @@ -80,7 +79,7 @@ public final class MethodProbesAdapter extends MethodVisitor { @Override public void visitLabel(final Label label) { - if (LabelInfo.isMultiTarget(label) && LabelInfo.isSuccessor(label)) { + if (LabelInfo.needsProbe(label)) { if (tryCatchProbeLabels.containsKey(label)) { probesVisitor.visitLabel(tryCatchProbeLabels.get(label)); } |