aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.core
diff options
context:
space:
mode:
Diffstat (limited to 'org.jacoco.core')
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java2
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java18
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java39
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java5
4 files changed, 60 insertions, 4 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
index d986e536..1095d95d 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
@@ -24,7 +24,7 @@ public class ExecutionDataWriter implements ISessionInfoVisitor,
IExecutionDataVisitor {
/** File format version, will be incremented for each incompatible change. */
- public static final char FORMAT_VERSION = 0x1006;
+ public static final char FORMAT_VERSION = 0x1007;
/** Magic number in header for file format identification. */
public static final char MAGIC_NUMBER = 0xC0C0;
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));
}