aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.core/src/org
diff options
context:
space:
mode:
authorEvgeny Mandrikov <138671+Godin@users.noreply.github.com>2019-01-22 23:23:48 +0100
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2019-01-22 23:23:48 +0100
commit2034d40ee2172339f33229f057d15b2b4e7aae29 (patch)
tree53df4f9b9b2b38ec208abfe7a59c3c3a1631357d /org.jacoco.core/src/org
parentb7441f2b51b3d147554845710c809e5a562dc36f (diff)
downloadjacoco-2034d40ee2172339f33229f057d15b2b4e7aae29.tar.gz
Add experimental support for Java 13 class files (#835)
Diffstat (limited to 'org.jacoco.core/src/org')
-rw-r--r--org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java3
-rw-r--r--org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java2
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java2
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java22
-rw-r--r--org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java2
5 files changed, 28 insertions, 3 deletions
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 8b927459..97aa44f1 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
@@ -30,6 +30,7 @@ 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.instr.InstrSupport;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
@@ -112,7 +113,7 @@ public class Analyzer {
private void analyzeClass(final byte[] source) {
final long classId = CRC64.classId(source);
- final ClassReader reader = new ClassReader(source);
+ final ClassReader reader = InstrSupport.classReaderFor(source);
if ((reader.getAccess() & Opcodes.ACC_SYNTHETIC) != 0) {
return;
}
diff --git a/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java b/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java
index 201d75ee..89f14019 100644
--- a/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java
+++ b/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java
@@ -83,7 +83,7 @@ public class Instrumenter {
private byte[] instrument(final byte[] source) {
final long classId = CRC64.classId(source);
- final ClassReader reader = new ClassReader(source);
+ final ClassReader reader = InstrSupport.classReaderFor(source);
final ClassWriter writer = new ClassWriter(reader, 0) {
@Override
protected String getCommonSuperClass(final String type1,
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java b/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java
index 1d7617ee..74574ecc 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java
@@ -88,6 +88,8 @@ public class ContentTypeDetector {
case Opcodes.V11 | Opcodes.V_PREVIEW:
case Opcodes.V12:
case Opcodes.V12 | Opcodes.V_PREVIEW:
+ case (Opcodes.V12 + 1):
+ case (Opcodes.V12 + 1) | Opcodes.V_PREVIEW:
return CLASSFILE;
}
}
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 ce4bcbee..99e00270 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
@@ -13,6 +13,7 @@ package org.jacoco.core.internal.instr;
import static java.lang.String.format;
+import org.objectweb.asm.ClassReader;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
@@ -227,4 +228,25 @@ public final class InstrSupport {
}
}
+ /**
+ * Creates a {@link ClassReader} instance for given bytes of class even if
+ * its version not yet supported by ASM.
+ *
+ * @param b
+ * bytes of class
+ * @return {@link ClassReader}
+ */
+ public static ClassReader classReaderFor(final byte[] b) {
+ final byte[] originalVersion = new byte[] { b[4], b[5], b[6], b[7] };
+ if (getVersionMajor(b) == Opcodes.V12 + 1) {
+ b[4] = (byte) (Opcodes.V12 >>> 24);
+ b[5] = (byte) (Opcodes.V12 >>> 16);
+ b[6] = (byte) (Opcodes.V12 >>> 8);
+ b[7] = (byte) Opcodes.V12;
+ }
+ final ClassReader classReader = new ClassReader(b);
+ System.arraycopy(originalVersion, 0, b, 4, originalVersion.length);
+ return classReader;
+ }
+
}
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java
index a18f7299..5f2cc497 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java
@@ -153,7 +153,7 @@ public class ModifiedSystemClassRuntime extends AbstractRuntime {
*/
public static byte[] instrument(final byte[] source,
final String accessFieldName) {
- final ClassReader reader = new ClassReader(source);
+ final ClassReader reader = InstrSupport.classReaderFor(source);
final ClassWriter writer = new ClassWriter(reader, 0);
reader.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION, writer) {