diff options
Diffstat (limited to 'org.jacoco.agent.rt')
-rw-r--r-- | org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java | 62 |
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('.', '/'); } |