aboutsummaryrefslogtreecommitdiff
path: root/third_party/jacoco-make-probe-adapter-subclassable.patch
blob: 2946fa8f05495f3fddbf0b4e667dac899c1b1259 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
commit 96d079e68e8897c425d85c7a5ff0afc755b246eb
Author: Fabian Meumertzheim <meumertzheim@code-intelligence.com>
Date:   Tue Apr 20 08:06:09 2021 +0200

    Updated Jazzer patch

diff --git org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
index 0cc06ada..b65efb03 100644
--- org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
+++ org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
@@ -31,6 +31,8 @@ import org.jacoco.core.internal.analysis.ClassCoverageImpl;
 import org.jacoco.core.internal.analysis.StringPool;
 import org.jacoco.core.internal.data.CRC64;
 import org.jacoco.core.internal.flow.ClassProbesAdapter;
+import org.jacoco.core.internal.flow.ClassProbesVisitor;
+import org.jacoco.core.internal.flow.IClassProbesAdapterFactory;
 import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
@@ -52,6 +54,8 @@ public class Analyzer {
 
 	private final StringPool stringPool;
 
+	private final IClassProbesAdapterFactory classProbesAdapterFactory;
+
 	/**
 	 * Creates a new analyzer reporting to the given output.
 	 *
@@ -63,9 +67,21 @@ public class Analyzer {
 	 */
 	public Analyzer(final ExecutionDataStore executionData,
 			final ICoverageVisitor coverageVisitor) {
+		this(executionData, coverageVisitor, new IClassProbesAdapterFactory() {
+			@Override
+			public ClassProbesAdapter makeClassProbesAdapter(ClassProbesVisitor cv, boolean trackFrames) {
+				return new ClassProbesAdapter(cv, trackFrames);
+			};
+		});
+	}
+
+	public Analyzer(final ExecutionDataStore executionData,
+			final ICoverageVisitor coverageVisitor,
+			final IClassProbesAdapterFactory classProbesAdapterFactory) {
 		this.executionData = executionData;
 		this.coverageVisitor = coverageVisitor;
 		this.stringPool = new StringPool();
+		this.classProbesAdapterFactory = classProbesAdapterFactory;
 	}
 
 	/**
@@ -99,7 +115,7 @@ public class Analyzer {
 				coverageVisitor.visitCoverage(coverage);
 			}
 		};
-		return new ClassProbesAdapter(analyzer, false);
+		return classProbesAdapterFactory.makeClassProbesAdapter(analyzer, false);
 	}
 
 	private void analyzeClass(final byte[] source) {
diff --git org.jacoco.core/src/org/jacoco/core/internal/analysis/InstructionsBuilder.java org.jacoco.core/src/org/jacoco/core/internal/analysis/InstructionsBuilder.java
index a69f34c8..ea1f0352 100644
--- org.jacoco.core/src/org/jacoco/core/internal/analysis/InstructionsBuilder.java
+++ org.jacoco.core/src/org/jacoco/core/internal/analysis/InstructionsBuilder.java
@@ -147,7 +147,8 @@ class InstructionsBuilder {
 	 */
 	void addProbe(final int probeId, final int branch) {
 		final boolean executed = probes != null && probes[probeId];
-		currentInsn.addBranch(executed, branch);
+		if (currentInsn != null)
+			currentInsn.addBranch(executed, branch);
 	}
 
 	/**
diff --git org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java
index 3ed19a88..f2b4f5d3 100644
--- org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java
+++ org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java
@@ -16,6 +16,7 @@ import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.commons.AnalyzerAdapter;
+import org.objectweb.asm.tree.MethodInsnNode;
 
 /**
  * A {@link org.objectweb.asm.ClassVisitor} that calculates probes for every
@@ -28,6 +29,7 @@ public class ClassProbesAdapter extends ClassVisitor
 	};
 
 	private final ClassProbesVisitor cv;
+	private final IMethodProbesAdapterFactory methodProbesAdapterFactory;
 
 	private final boolean trackFrames;
 
@@ -45,9 +47,21 @@ public class ClassProbesAdapter extends ClassVisitor
 	 */
 	public ClassProbesAdapter(final ClassProbesVisitor cv,
 			final boolean trackFrames) {
+		this(cv, trackFrames, new IMethodProbesAdapterFactory() {
+			@Override
+			public MethodProbesAdapter makeMethodProbesAdapter(MethodProbesVisitor probesVisitor,
+					IProbeIdGenerator idGenerator) {
+				return new MethodProbesAdapter(probesVisitor, idGenerator);
+			}
+		});
+	}
+
+	public ClassProbesAdapter(final ClassProbesVisitor cv,
+			final boolean trackFrames, IMethodProbesAdapterFactory methodProbesAdapterFactory) {
 		super(InstrSupport.ASM_API_VERSION, cv);
 		this.cv = cv;
 		this.trackFrames = trackFrames;
+		this.methodProbesAdapterFactory = methodProbesAdapterFactory;
 	}
 
 	@Override
@@ -79,8 +93,9 @@ public class ClassProbesAdapter extends ClassVisitor
 			public void visitEnd() {
 				super.visitEnd();
 				LabelFlowAnalyzer.markLabels(this);
-				final MethodProbesAdapter probesAdapter = new MethodProbesAdapter(
-						methodProbes, ClassProbesAdapter.this);
+				final MethodProbesAdapter probesAdapter =
+						methodProbesAdapterFactory.makeMethodProbesAdapter(
+								methodProbes, ClassProbesAdapter.this);
 				if (trackFrames) {
 					final AnalyzerAdapter analyzer = new AnalyzerAdapter(
 							ClassProbesAdapter.this.name, access, name, desc,
diff --git org.jacoco.core/src/org/jacoco/core/internal/flow/IClassProbesAdapterFactory.java org.jacoco.core/src/org/jacoco/core/internal/flow/IClassProbesAdapterFactory.java
new file mode 100644
index 00000000..45fc2709
--- /dev/null
+++ org.jacoco.core/src/org/jacoco/core/internal/flow/IClassProbesAdapterFactory.java
@@ -0,0 +1,6 @@
+package org.jacoco.core.internal.flow;
+
+public interface IClassProbesAdapterFactory {
+	ClassProbesAdapter makeClassProbesAdapter(ClassProbesVisitor cv,
+			boolean trackFrames);
+}
diff --git org.jacoco.core/src/org/jacoco/core/internal/flow/IMethodProbesAdapterFactory.java org.jacoco.core/src/org/jacoco/core/internal/flow/IMethodProbesAdapterFactory.java
new file mode 100644
index 00000000..4e5460f1
--- /dev/null
+++ org.jacoco.core/src/org/jacoco/core/internal/flow/IMethodProbesAdapterFactory.java
@@ -0,0 +1,8 @@
+package org.jacoco.core.internal.flow;
+
+import org.objectweb.asm.MethodVisitor;
+
+public interface IMethodProbesAdapterFactory {
+	MethodProbesAdapter makeMethodProbesAdapter(MethodProbesVisitor probesVisitor,
+			IProbeIdGenerator idGenerator);
+}
diff --git org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java
index 30253d02..e019a290 100644
--- org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java
+++ org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java
@@ -25,9 +25,9 @@ import org.objectweb.asm.commons.AnalyzerAdapter;
  * Adapter that creates additional visitor events for probes to be inserted into
  * a method.
  */
-public final class MethodProbesAdapter extends MethodVisitor {
+public class MethodProbesAdapter extends MethodVisitor {
 
-	private final MethodProbesVisitor probesVisitor;
+	protected final MethodProbesVisitor probesVisitor;
 
 	private final IProbeIdGenerator idGenerator;