aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.agent.rt
diff options
context:
space:
mode:
authorMarc R. Hoffmann <hoffmann@mountainminds.com>2016-01-12 22:33:05 +0100
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2016-01-13 06:42:02 +0100
commit26daee44414eeecb0a7a63d7f6784fcf4cfe32fa (patch)
tree0f61411385d53b3c004015b09a2d1f491d6ac639 /org.jacoco.agent.rt
parenta6d2b043f09984e3f2fe77e9f7502564350055f6 (diff)
downloadjacoco-26daee44414eeecb0a7a63d7f6784fcf4cfe32fa.tar.gz
GitHub #288: New agent option 'inclnolocationclasses'
With the new agent option 'inclnolocationclasses' classes without source location can be optionally included. This helps to retrieve code coverage for environments like Android where no source location is provided at runtime.
Diffstat (limited to 'org.jacoco.agent.rt')
-rw-r--r--org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java62
1 files changed, 33 insertions, 29 deletions
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
index 41c97034..3ab04436 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
@@ -45,7 +45,9 @@ public class CoverageTransformer implements ClassFileTransformer {
private final ClassFileDumper classFileDumper;
- private final boolean includeBootstrapClasses;
+ private final boolean inclBootstrapClasses;
+
+ private final boolean inclNoLocationClasses;
/**
* New transformer with the given delegates.
@@ -66,7 +68,8 @@ public class CoverageTransformer implements ClassFileTransformer {
excludes = new WildcardMatcher(toVMName(options.getExcludes()));
exclClassloader = new WildcardMatcher(options.getExclClassloader());
classFileDumper = new ClassFileDumper(options.getClassDumpDir());
- includeBootstrapClasses = options.getInclBootstrapClasses();
+ inclBootstrapClasses = options.getInclBootstrapClasses();
+ inclNoLocationClasses = options.getInclNoLocationClasses();
}
public byte[] transform(final ClassLoader loader, final String classname,
@@ -79,12 +82,7 @@ public class CoverageTransformer implements ClassFileTransformer {
return null;
}
- // We exclude dynamically created non-bootstrap classes.
- if (loader != null && !hasSourceLocation(protectionDomain)) {
- return null;
- }
-
- if (!filter(loader, classname)) {
+ if (!filter(loader, classname, protectionDomain)) {
return null;
}
@@ -102,39 +100,26 @@ public class CoverageTransformer implements ClassFileTransformer {
}
/**
- * Checks whether this protection domain is associated with a source
- * location.
- *
- * @param protectionDomain
- * protection domain to check (or <code>null</code>)
- * @return <code>true</code> if a source location is defined
- */
- boolean hasSourceLocation(final ProtectionDomain protectionDomain) {
- if (protectionDomain == null) {
- return false;
- }
- final CodeSource codeSource = protectionDomain.getCodeSource();
- if (codeSource == null) {
- return false;
- }
- return codeSource.getLocation() != null;
- }
-
- /**
* Checks whether this class should be instrumented.
*
* @param loader
* loader for the class
* @param classname
* VM name of the class to check
+ * @param protectionDomain
+ * protection domain for the class
* @return <code>true</code> if the class should be instrumented
*/
- boolean filter(final ClassLoader loader, final String classname) {
+ boolean filter(final ClassLoader loader, final String classname,
+ final ProtectionDomain protectionDomain) {
if (loader == null) {
- if (!includeBootstrapClasses) {
+ if (!inclBootstrapClasses) {
return false;
}
} else {
+ if (!inclNoLocationClasses && !hasSourceLocation(protectionDomain)) {
+ return false;
+ }
if (exclClassloader.matches(loader.getClass().getName())) {
return false;
}
@@ -147,6 +132,25 @@ public class CoverageTransformer implements ClassFileTransformer {
!excludes.matches(classname);
}
+ /**
+ * Checks whether this protection domain is associated with a source
+ * location.
+ *
+ * @param protectionDomain
+ * protection domain to check (or <code>null</code>)
+ * @return <code>true</code> if a source location is defined
+ */
+ private boolean hasSourceLocation(final ProtectionDomain protectionDomain) {
+ if (protectionDomain == null) {
+ return false;
+ }
+ final CodeSource codeSource = protectionDomain.getCodeSource();
+ if (codeSource == null) {
+ return false;
+ }
+ return codeSource.getLocation() != null;
+ }
+
private static String toVMName(final String srcName) {
return srcName.replace('.', '/');
}