aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Nguyen <olivernguyen@google.com>2020-07-09 15:11:30 -0700
committerOliver Nguyen <olivernguyen@google.com>2020-08-11 10:58:54 -0700
commit28558ef2ec7635c0a7e10fbb1fe9b8a80d32b636 (patch)
treeff121ba8fcc1140f854ff568722192877ffeae6a
parentbdbfb7047d87e8e790260a0fffb1afdf37ed3dc8 (diff)
downloadplatform_external_jacoco-28558ef2ec7635c0a7e10fbb1fe9b8a80d32b636.tar.gz
platform_external_jacoco-28558ef2ec7635c0a7e10fbb1fe9b8a80d32b636.tar.bz2
platform_external_jacoco-28558ef2ec7635c0a7e10fbb1fe9b8a80d32b636.zip
Add IExecutionData interface and move all usage to the interface.
Abstracts the underlying execution data implementation to allow for more complex execution data storage mechanisms. For offline instrumentation, classes store the IExecutionData object and make calls into it to set probe data. This results in additional overhead of looking up the vtable for the interface and making the method call, rather than just directly setting the value in the boolean array. Bug: 147904124 Test: m EMMA_INSTRUMENT=true EMMA_INSTRUMENT_FRAMEWORK=true and verify Java coverage collection and parsing Change-Id: I41235626b1040a6a21c6aef300f2dfe064393e1f
-rw-r--r--Android.bp5
-rw-r--r--org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java18
-rw-r--r--org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java10
-rw-r--r--org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java8
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java52
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java48
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java8
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java129
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java4
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java8
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java17
-rw-r--r--org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java4
-rw-r--r--org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java6
-rw-r--r--org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java20
-rw-r--r--org.jacoco.report/src/org/jacoco/report/IReportVisitor.java6
-rw-r--r--org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java6
-rw-r--r--org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java6
-rw-r--r--org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java6
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java10
-rw-r--r--org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java22
-rw-r--r--org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java6
21 files changed, 313 insertions, 86 deletions
diff --git a/Android.bp b/Android.bp
index 0641bdec..7b7d3f49 100644
--- a/Android.bp
+++ b/Android.bp
@@ -66,7 +66,10 @@ java_library {
// Generates stubs containing the classes that will be referenced by instrumented bytecode.
droidstubs {
name: "jacoco-stubs-gen",
- srcs: ["org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java"],
+ srcs: [
+ "org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java",
+ "org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java",
+ ],
}
// A stubs target containing the parts of JaCoCo that we need to add to the hidden API whitelist.
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
index 69a9909e..ee9d40b1 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
@@ -16,6 +16,7 @@ import java.util.Map;
import java.util.Properties;
import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.ExecutionDataStore;
import org.jacoco.core.runtime.AgentOptions;
import org.jacoco.core.runtime.RuntimeData;
@@ -28,7 +29,7 @@ public final class Offline {
// BEGIN android-change
// private static final RuntimeData DATA;
- private static final Map<Long, ExecutionData> DATA = new HashMap<Long, ExecutionData>();
+ private static final Map<Long, IExecutionData> DATA = new HashMap<Long, IExecutionData>();
// END android-change
private static final String CONFIG_RESOURCE = "/jacoco-agent.properties";
@@ -44,6 +45,7 @@ public final class Offline {
// no instances
}
+ // BEGIN android-change
/**
* API for offline instrumented classes.
*
@@ -53,27 +55,25 @@ public final class Offline {
* VM class name
* @param probecount
* probe count for this class
- * @return probe array instance for this class
+ * @return IExecutionData instance for this class
*/
- public static boolean[] getProbes(final long classid,
+ public static IExecutionData getExecutionData(final long classid,
final String classname, final int probecount) {
- // BEGIN android-change
// return DATA.getExecutionData(Long.valueOf(classid), classname,
// probecount).getProbes();
synchronized (DATA) {
- ExecutionData entry = DATA.get(classid);
+ IExecutionData entry = DATA.get(classid);
if (entry == null) {
entry = new ExecutionData(classid, classname, probecount);
DATA.put(classid, entry);
} else {
entry.assertCompatibility(classid, classname, probecount);
}
- return entry.getProbes();
+ return entry;
}
- // END android-change
}
+ // END android-change
- // BEGIN android-change
/**
* Creates a default agent, using config loaded from the classpath resource and the system
* properties, and a runtime data instance populated with the execution data accumulated by
@@ -87,7 +87,7 @@ public final class Offline {
System.getProperties());
synchronized (DATA) {
ExecutionDataStore store = new ExecutionDataStore();
- for (ExecutionData data : DATA.values()) {
+ for (IExecutionData data : DATA.values()) {
store.put(data);
}
return Agent.getInstance(new AgentOptions(config), new RuntimeData(store));
diff --git a/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java b/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java
index cacf4cbe..4519d28f 100644
--- a/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java
+++ b/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java
@@ -20,7 +20,7 @@ import java.util.Date;
import java.util.List;
import org.jacoco.cli.internal.Command;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.ExecutionDataReader;
import org.jacoco.core.data.IExecutionDataVisitor;
import org.jacoco.core.data.ISessionInfoVisitor;
@@ -68,13 +68,15 @@ public class ExecInfo extends Command {
}
});
reader.setExecutionDataVisitor(new IExecutionDataVisitor() {
- public void visitClassExecution(final ExecutionData data) {
+ // BEGIN android-change
+ public void visitClassExecution(final IExecutionData data) {
out.printf("%016x %3d of %3d %s%n",
Long.valueOf(data.getId()),
- Integer.valueOf(getHitCount(data.getProbes())),
- Integer.valueOf(data.getProbes().length),
+ Integer.valueOf(getHitCount(data.getProbesCopy())),
+ Integer.valueOf(data.getProbeCount()),
data.getName());
}
+ // END android-change
});
reader.read();
in.close();
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java b/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
index 76b7be3c..7759b89d 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
@@ -20,7 +20,7 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.ExecutionDataStore;
import org.jacoco.core.internal.ContentTypeDetector;
import org.jacoco.core.internal.InputStreams;
@@ -78,16 +78,18 @@ public class Analyzer {
*/
private ClassVisitor createAnalyzingVisitor(final long classid,
final String className) {
- final ExecutionData data = executionData.get(classid);
+ // BEGIN android-change
+ final IExecutionData data = executionData.get(classid);
final boolean[] probes;
final boolean noMatch;
if (data == null) {
probes = null;
noMatch = executionData.contains(className);
} else {
- probes = data.getProbes();
+ probes = data.getProbesCopy();
noMatch = false;
}
+ // END android-change
final ClassCoverageImpl coverage = new ClassCoverageImpl(className,
classid, noMatch);
final ClassAnalyzer analyzer = new ClassAnalyzer(coverage, probes,
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
index d98775eb..a728e033 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
@@ -20,7 +20,9 @@ import java.util.Arrays;
* has to be taken about the probe data array of type <code>boolean[]</code>
* which can be modified.
*/
-public final class ExecutionData {
+// BEGIN android-change
+public final class ExecutionData implements IExecutionData {
+// END android-change
private final long id;
@@ -81,15 +83,43 @@ public final class ExecutionData {
return name;
}
+ // BEGIN android-change
/**
- * Returns the execution data probes. A value of <code>true</code> indicates
- * that the corresponding probe was executed.
+ * Returns a copy of the current probe values.
+ *
+ * @return copy of the probe array
+ */
+ public boolean[] getProbesCopy() {
+ return Arrays.copyOf(probes, probes.length);
+ }
+
+ /**
+ * The number of probes in this ExecutionData.
+ *
+ * @return the number of probes
+ */
+ public int getProbeCount() {
+ return probes.length;
+ }
+
+ /**
+ * Returns the execution data probe for a given index. A value of
+ * <code>true</code> indicates that the corresponding probe was
+ * executed.
*
* @return probe data
*/
- public boolean[] getProbes() {
- return probes;
+ public boolean getProbe(final int index) {
+ return probes[index];
+ }
+
+ /**
+ * Sets the execution data probe for a given index to <code>true</code>.
+ */
+ public void setProbe(final int index) {
+ probes[index] = true;
}
+ // END android-change
/**
* Sets all probes to <code>false</code>.
@@ -127,7 +157,9 @@ public final class ExecutionData {
* @param other
* execution data to merge
*/
- public void merge(final ExecutionData other) {
+ // BEGIN android-change
+ public void merge(final IExecutionData other) {
+ // END android-change
merge(other, true);
}
@@ -154,10 +186,12 @@ public final class ExecutionData {
* @param flag
* merge mode
*/
- public void merge(final ExecutionData other, final boolean flag) {
+ public void merge(final IExecutionData other, final boolean flag) {
+ // BEGIN android-change
assertCompatibility(other.getId(), other.getName(),
- other.getProbes().length);
- final boolean[] otherData = other.getProbes();
+ other.getProbeCount());
+ final boolean[] otherData = other.getProbesCopy();
+ // END android-change
for (int i = 0; i < probes.length; i++) {
if (otherData[i]) {
probes[i] = flag;
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
index 3e567a3b..ce0bec47 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
@@ -28,7 +28,9 @@ import java.util.Set;
*/
public final class ExecutionDataStore implements IExecutionDataVisitor {
- private final Map<Long, ExecutionData> entries = new HashMap<Long, ExecutionData>();
+ // BEGIN android-change
+ private final Map<Long, IExecutionData> entries = new HashMap<Long, IExecutionData>();
+ // END android-change
private final Set<String> names = new HashSet<String>();
@@ -44,9 +46,11 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* to a corresponding one, that is already contained
* @see ExecutionData#assertCompatibility(long, String, int)
*/
- public void put(final ExecutionData data) throws IllegalStateException {
+ // BEGIN android-change
+ public void put(final IExecutionData data) throws IllegalStateException {
final Long id = Long.valueOf(data.getId());
- final ExecutionData entry = entries.get(id);
+ final IExecutionData entry = entries.get(id);
+ // END android-change
if (entry == null) {
entries.put(id, data);
names.add(data.getName());
@@ -68,9 +72,11 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* to a corresponding one, that is already contained
* @see ExecutionData#assertCompatibility(long, String, int)
*/
- public void subtract(final ExecutionData data) throws IllegalStateException {
+ // BEGIN android-change
+ public void subtract(final IExecutionData data) throws IllegalStateException {
final Long id = Long.valueOf(data.getId());
- final ExecutionData entry = entries.get(id);
+ final IExecutionData entry = entries.get(id);
+ // END android-change
if (entry != null) {
entry.merge(data, false);
}
@@ -84,7 +90,9 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* @see #subtract(ExecutionData)
*/
public void subtract(final ExecutionDataStore store) {
- for (final ExecutionData data : store.getContents()) {
+ // BEGIN android-change
+ for (final IExecutionData data : store.getContents()) {
+ // END android-change
subtract(data);
}
}
@@ -97,7 +105,9 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* class id
* @return execution data or <code>null</code>
*/
- public ExecutionData get(final long id) {
+ // BEGIN android-change
+ public IExecutionData get(final long id) {
+ // END android-change
return entries.get(Long.valueOf(id));
}
@@ -126,9 +136,11 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* probe data length
* @return execution data
*/
- public ExecutionData get(final Long id, final String name,
+ // BEGIN android-change
+ public IExecutionData get(final Long id, final String name,
final int probecount) {
- ExecutionData entry = entries.get(id);
+ IExecutionData entry = entries.get(id);
+ // END android-change
if (entry == null) {
entry = new ExecutionData(id.longValue(), name, probecount);
entries.put(id, entry);
@@ -144,7 +156,9 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* execution data objects itself are not removed.
*/
public void reset() {
- for (final ExecutionData executionData : this.entries.values()) {
+ // BEGIN android-change
+ for (final IExecutionData executionData : this.entries.values()) {
+ // END android-change
executionData.reset();
}
}
@@ -154,9 +168,11 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
*
* @return current contents
*/
- public Collection<ExecutionData> getContents() {
- return new ArrayList<ExecutionData>(entries.values());
+ // BEGIN android-change
+ public Collection<IExecutionData> getContents() {
+ return new ArrayList<IExecutionData>(entries.values());
}
+ // END android-change
/**
* Writes the content of the store to the given visitor interface.
@@ -165,14 +181,18 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* interface to write content to
*/
public void accept(final IExecutionDataVisitor visitor) {
- for (final ExecutionData data : getContents()) {
+ // BEGIN android-change
+ for (final IExecutionData data : getContents()) {
+ // END android-change
visitor.visitClassExecution(data);
}
}
// === IExecutionDataVisitor ===
- public void visitClassExecution(final ExecutionData data) {
+ // BEGIN android-change
+ public void visitClassExecution(final IExecutionData data) {
+ // END android-change
put(data);
}
}
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 e697dda3..bdf3445d 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
@@ -94,13 +94,17 @@ public class ExecutionDataWriter implements ISessionInfoVisitor,
}
}
- public void visitClassExecution(final ExecutionData data) {
+ // BEGIN android-change
+ public void visitClassExecution(final IExecutionData data) {
+ // END android-change
if (data.hasHits()) {
try {
out.writeByte(BLOCK_EXECUTIONDATA);
out.writeLong(data.getId());
out.writeUTF(data.getName());
- out.writeBooleanArray(data.getProbes());
+ // BEGIN android-change
+ out.writeBooleanArray(data.getProbesCopy());
+ // END android-change
} catch (final IOException e) {
throw new RuntimeException(e);
}
diff --git a/org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java b/org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java
new file mode 100644
index 00000000..289c3726
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java
@@ -0,0 +1,129 @@
+// BEGIN android-change
+package org.jacoco.core.data;
+
+/**
+ * Interface for interacting with execution data for a single Java class.
+ */
+public interface IExecutionData {
+
+ /**
+ * Return the unique identifier for this class. The identifier is the CRC64
+ * checksum of the raw class file definition.
+ *
+ * @return class identifier
+ */
+ public abstract long getId();
+
+ /**
+ * The VM name of the class.
+ *
+ * @return VM name
+ */
+ public abstract String getName();
+
+ /**
+ * The number of instrumentation probes for this class.
+ *
+ * @return number of probes
+ */
+ public abstract int getProbeCount();
+
+ /**
+ * Returns a copy of the probe data as a boolean array.
+ *
+ * Changes to the returned array will not be reflected in the execution data.
+ *
+ * @return copy of the probe data
+ */
+ public abstract boolean[] getProbesCopy();
+
+ /**
+ * Sets all probes to <code>false</code>.
+ */
+ public abstract void reset();
+
+ /**
+ * Checks whether any probe has been hit.
+ *
+ * @return <code>true</code>, if at least one probe has been hit
+ */
+ public abstract boolean hasHits();
+
+ /**
+ * Merges the given execution data into the probe data of this object. I.e.
+ * a probe entry in this object is marked as executed (<code>true</code>) if
+ * this probe or the corresponding other probe was executed. So the result
+ * is
+ *
+ * <pre>
+ * A or B
+ * </pre>
+ *
+ * The probe array of the other object is not modified.
+ *
+ * @param other
+ * execution data to merge
+ */
+ public abstract void merge(final IExecutionData other);
+
+ /**
+ * Merges the given execution data into the probe data of this object. A
+ * probe in this object is set to the value of <code>flag</code> if the
+ * corresponding other probe was executed. For <code>flag==true</code> this
+ * corresponds to
+ *
+ * <pre>
+ * A or B
+ * </pre>
+ *
+ * For <code>flag==false</code> this can be considered as a subtraction
+ *
+ * <pre>
+ * A and not B
+ * </pre>
+ *
+ * The probe array of the other object is not modified.
+ *
+ * @param other
+ * execution data to merge
+ * @param flag
+ * merge mode
+ */
+ public abstract void merge(final IExecutionData other, boolean flag);
+
+ /**
+ * Asserts that this execution data object is compatible with the given
+ * parameters. The purpose of this check is to detect a very unlikely class
+ * id collision.
+ *
+ * @param id
+ * other class id, must be the same
+ * @param name
+ * other name, must be equal to this name
+ * @param probecount
+ * probe data length, must be the same as for this data
+ * @throws IllegalStateException
+ * if the given parameters do not match this instance
+ */
+ public abstract void assertCompatibility(final long id, final String name, final int probeCount) throws IllegalStateException;
+
+ /**
+ * Returns the execution data probe for a given index. A value of
+ * <code>true</code> indicates that the corresponding probe was
+ * executed.
+ *
+ * @param index the probe's index to look up
+ *
+ * @return probe data
+ */
+ public abstract boolean getProbe(final int index);
+
+ /**
+ * Sets the execution data probe at the given index to <code>true</code>.
+ *
+ * @param index the probe's index to set
+ * @param value the value to set the probe to
+ */
+ public abstract void setProbe(final int index);
+}
+// END android-change
diff --git a/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java b/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
index 6cea7c57..14eabbe7 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
@@ -24,6 +24,8 @@ public interface IExecutionDataVisitor {
* @param data
* execution data for a class
*/
- void visitClassExecution(ExecutionData data);
+ // BEGIN android-change
+ void visitClassExecution(IExecutionData data);
+ // END android-change
}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java
index 85e83a3a..4d4e1ba1 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java
@@ -77,7 +77,9 @@ public final class InstrSupport {
* Data type of the field that stores coverage information for a class (
* <code>boolean[]</code>).
*/
- public static final String DATAFIELD_DESC = "[Z";
+ // BEGIN android-change
+ public static final String DATAFIELD_DESC = "Lorg/jacoco/core/data/IExecutionData;";
+ // END android-change
// === Init Method ===
@@ -89,7 +91,9 @@ public final class InstrSupport {
/**
* Descriptor of the initialization method.
*/
- public static final String INITMETHOD_DESC = "()[Z";
+ // BEGIN android-change
+ public static final String INITMETHOD_DESC = "()Lorg/jacoco/core/data/IExecutionData;";
+ // END android-change
/**
* Access modifiers of the initialization method.
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java
index 63fbf765..0cac8f8f 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java
@@ -67,25 +67,20 @@ class ProbeInserter extends MethodVisitor implements IProbeInserter {
public void insertProbe(final int id) {
- // For a probe we set the corresponding position in the boolean[] array
- // to true.
+ // BEGIN android-change
+ // For a probe we call setProbe on the IExecutionData object.
mv.visitVarInsn(Opcodes.ALOAD, variable);
- // Stack[0]: [Z
+ // Stack[0]: Lorg/jacoco/core/data/IExecutionData;
InstrSupport.push(mv, id);
// Stack[1]: I
- // Stack[0]: [Z
+ // Stack[0]: Lorg/jacoco/core/data/IExecutionData;
- mv.visitInsn(Opcodes.ICONST_1);
-
- // Stack[2]: I
- // Stack[1]: I
- // Stack[0]: [Z
-
- mv.visitInsn(Opcodes.BASTORE);
+ mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "org/jacoco/core/data/IExecutionData", "setProbe", "(I)V", true);
+ // END android-change
}
@Override
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
index 72553956..bef42030 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
@@ -168,7 +168,9 @@ public class LoggerRuntime extends AbstractRuntime {
@Override
public void publish(final LogRecord record) {
if (key.equals(record.getMessage())) {
- data.getProbes(record.getParameters());
+ // BEGIN android-change
+ data.getExecutionData(record.getParameters());
+ // END android-change
}
}
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java b/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
index af6671ee..a5e88b60 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
@@ -50,8 +50,10 @@ public class OfflineInstrumentationAccessGenerator implements
mv.visitLdcInsn(Long.valueOf(classid));
mv.visitLdcInsn(classname);
InstrSupport.push(mv, probecount);
- mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeClassName, "getProbes",
- "(JLjava/lang/String;I)[Z", false);
+ // BEGIN android-change
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeClassName, "getExecutionData",
+ "(JLjava/lang/String;I)Lorg/jacoco/core/data/IExecutionData;", false);
+ // END android-change
return 4;
}
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java b/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
index afb5b7f3..c0fbb654 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
@@ -11,7 +11,7 @@
*******************************************************************************/
package org.jacoco.core.runtime;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.ExecutionDataStore;
import org.jacoco.core.data.IExecutionDataVisitor;
import org.jacoco.core.data.ISessionInfoVisitor;
@@ -128,15 +128,18 @@ public class RuntimeData {
* probe data length
* @return execution data
*/
- public ExecutionData getExecutionData(final Long id, final String name,
+ // BEGIN android-change
+ public IExecutionData getExecutionData(final Long id, final String name,
final int probecount) {
+ // END android-change
synchronized (store) {
return store.get(id, name, probecount);
}
}
+ // BEGIN android-change
/**
- * Retrieves the execution probe array for a given class. The passed
+ * Retrieves the execution data for a given class. The passed
* {@link Object} array instance is used for parameters and the return value
* as follows. Call parameters:
*
@@ -149,18 +152,19 @@ public class RuntimeData {
* Return value:
*
* <ul>
- * <li>args[0]: probe array (<code>boolean[]</code>)
+ * <li>args[0]: execution data ({@link IExecutionData})
* </ul>
*
* @param args
* parameter array of length 3
*/
- public void getProbes(final Object[] args) {
+ public void getExecutionData(final Object[] args) {
final Long classid = (Long) args[0];
final String name = (String) args[1];
final int probecount = ((Integer) args[2]).intValue();
- args[0] = getExecutionData(classid, name, probecount).getProbes();
+ args[0] = getExecutionData(classid, name, probecount);
}
+ // END android-change
/**
* In violation of the regular semantic of {@link Object#equals(Object)}
@@ -173,7 +177,9 @@ public class RuntimeData {
@Override
public boolean equals(final Object args) {
if (args instanceof Object[]) {
- getProbes((Object[]) args);
+ // BEGIN android-change
+ getExecutionData((Object[]) args);
+ // END android-change
}
return super.equals(args);
}
diff --git a/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java b/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
index db36796d..1cf4aed4 100644
--- a/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
@@ -15,7 +15,7 @@ import java.io.IOException;
import java.util.Collection;
import java.util.List;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
/**
@@ -39,7 +39,9 @@ public interface IReportVisitor extends IReportGroupVisitor {
* in case of IO problems with the report writer
*/
void visitInfo(List<SessionInfo> sessionInfos,
- Collection<ExecutionData> executionData) throws IOException;
+ // BEGIN android-change
+ Collection<IExecutionData> executionData) throws IOException;
+ // END android-change
/**
* Has to be called after all report data has been emitted.
diff --git a/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java b/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
index 3cd5e558..f4fefa85 100644
--- a/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
@@ -17,7 +17,7 @@ import java.util.Collection;
import java.util.List;
import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
/**
@@ -41,7 +41,9 @@ public class MultiReportVisitor extends MultiGroupVisitor implements
}
public void visitInfo(final List<SessionInfo> sessionInfos,
- final Collection<ExecutionData> executionData) throws IOException {
+ // BEGIN android-change
+ final Collection<IExecutionData> executionData) throws IOException {
+ // END android-chnage
for (final IReportVisitor v : visitors) {
v.visitInfo(sessionInfos, executionData);
}
diff --git a/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java b/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
index cc6acf04..f7435600 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
@@ -17,7 +17,7 @@ import java.util.Collection;
import java.util.List;
import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
import org.jacoco.report.ILanguageNames;
import org.jacoco.report.IReportGroupVisitor;
@@ -86,7 +86,9 @@ public class RulesChecker {
}
public void visitInfo(final List<SessionInfo> sessionInfos,
- final Collection<ExecutionData> executionData)
+ // BEGIN android-change
+ final Collection<IExecutionData> executionData)
+ // END android-change
throws IOException {
}
diff --git a/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java b/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
index 793e2153..42939daa 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
@@ -17,7 +17,7 @@ import java.io.OutputStreamWriter;
import java.util.Collection;
import java.util.List;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
import org.jacoco.report.ILanguageNames;
import org.jacoco.report.IReportVisitor;
@@ -84,7 +84,9 @@ public class CSVFormatter {
}
public void visitInfo(final List<SessionInfo> sessionInfos,
- final Collection<ExecutionData> executionData)
+ // BEGIN android-change
+ final Collection<IExecutionData> executionData)
+ // END android-change
throws IOException {
// Info not used for CSV report
}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
index 9994ced0..ce8cd2d9 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
@@ -18,7 +18,7 @@ import java.util.Locale;
import org.jacoco.core.analysis.IBundleCoverage;
import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
import org.jacoco.report.ILanguageNames;
import org.jacoco.report.IMultiReportOutput;
@@ -193,12 +193,16 @@ public class HTMLFormatter implements IHTMLReportContext {
return new IReportVisitor() {
private List<SessionInfo> sessionInfos;
- private Collection<ExecutionData> executionData;
+ // BEGIN android-change
+ private Collection<IExecutionData> executionData;
+ // END android-change
private HTMLGroupVisitor groupHandler;
public void visitInfo(final List<SessionInfo> sessionInfos,
- final Collection<ExecutionData> executionData)
+ // BEGIN android-change
+ final Collection<IExecutionData> executionData)
+ // END android-change
throws IOException {
this.sessionInfos = sessionInfos;
this.executionData = executionData;
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java
index 67de4941..3a489025 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java
@@ -20,7 +20,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.List;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
import org.jacoco.report.ILanguageNames;
import org.jacoco.report.internal.ReportOutputFolder;
@@ -48,7 +48,7 @@ public class SessionsPage extends ReportPage {
private final DateFormat dateFormat;
- private final List<ExecutionData> executionData;
+ private final List<IExecutionData> executionData;
private final ElementIndex index;
@@ -69,18 +69,24 @@ public class SessionsPage extends ReportPage {
* settings context
*/
public SessionsPage(final List<SessionInfo> sessionInfos,
- final Collection<ExecutionData> executionData,
+ // BEGIN android-change
+ final Collection<IExecutionData> executionData,
+ // END android-change
final ElementIndex index, final ReportPage parent,
final ReportOutputFolder folder, final IHTMLReportContext context) {
super(parent, folder, context);
this.sessionInfos = sessionInfos;
- this.executionData = new ArrayList<ExecutionData>(executionData);
+ // BEGIN android-change
+ this.executionData = new ArrayList<IExecutionData>(executionData);
+ // END android-change
this.index = index;
this.dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,
DateFormat.DEFAULT, context.getLocale());
final ILanguageNames names = context.getLanguageNames();
- Collections.sort(this.executionData, new Comparator<ExecutionData>() {
- public int compare(final ExecutionData e1, final ExecutionData e2) {
+ // BEGIN android-change
+ Collections.sort(this.executionData, new Comparator<IExecutionData>() {
+ public int compare(final IExecutionData e1, final IExecutionData e2) {
+ // END android-change
return names.getQualifiedClassName(e1.getName()).compareTo(
names.getQualifiedClassName(e2.getName()));
}
@@ -129,7 +135,9 @@ public class SessionsPage extends ReportPage {
}
final HTMLElement tbody = table.tbody();
final ILanguageNames names = context.getLanguageNames();
- for (final ExecutionData e : executionData) {
+ // BEGIN android-change
+ for (final IExecutionData e : executionData) {
+ // END android-change
final HTMLElement tr = tbody.tr();
final String link = index.getLinkToClass(e.getId());
final String qualifiedName = names.getQualifiedClassName(e
diff --git a/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java b/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
index a1fee86e..3bda5ed4 100644
--- a/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
@@ -17,7 +17,7 @@ import java.util.Collection;
import java.util.List;
import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.data.ExecutionData;
+import org.jacoco.core.data.IExecutionData;
import org.jacoco.core.data.SessionInfo;
import org.jacoco.report.IReportGroupVisitor;
import org.jacoco.report.IReportVisitor;
@@ -61,7 +61,9 @@ public class XMLFormatter {
private XMLGroupVisitor groupVisitor;
public void visitInfo(final List<SessionInfo> sessionInfos,
- final Collection<ExecutionData> executionData)
+ // BEGIN android-change
+ final Collection<IExecutionData> executionData)
+ // END android-change
throws IOException {
this.sessionInfos = sessionInfos;
}