aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java')
-rw-r--r--org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java34
1 files changed, 30 insertions, 4 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 3130ec59..b2688890 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
@@ -13,6 +13,7 @@ package org.jacoco.agent.rt.internal;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
+import java.security.CodeSource;
import java.security.ProtectionDomain;
import org.jacoco.core.instr.Instrumenter;
@@ -73,8 +74,13 @@ public class CoverageTransformer implements ClassFileTransformer {
final ProtectionDomain protectionDomain,
final byte[] classfileBuffer) throws IllegalClassFormatException {
+ // We do not support class retransformation:
if (classBeingRedefined != null) {
- // We do not support class retransformation.
+ return null;
+ }
+
+ // We exclude dynamically created non-bootstrap classes.
+ if (loader != null && !hasSourceLocation(protectionDomain)) {
return null;
}
@@ -96,6 +102,25 @@ 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
@@ -104,11 +129,12 @@ public class CoverageTransformer implements ClassFileTransformer {
* VM name of the class to check
* @return <code>true</code> if the class should be instrumented
*/
- protected boolean filter(final ClassLoader loader, final String classname) {
- if (!includeBootstrapClasses) {
- if (loader == null) {
+ boolean filter(final ClassLoader loader, final String classname) {
+ if (loader == null) {
+ if (!includeBootstrapClasses) {
return false;
}
+ } else {
if (exclClassloader.matches(loader.getClass().getName())) {
return false;
}