aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.core/src/org/jacoco/core/internal
diff options
context:
space:
mode:
authorEvgeny Mandrikov <138671+Godin@users.noreply.github.com>2019-03-05 06:53:49 +0100
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2019-03-05 06:53:49 +0100
commit36b4e9c7103441d556a1667b4485960f5bdfeff8 (patch)
treefdf32b3ba388e592850d6a2c5e7746b8491dcfe2 /org.jacoco.core/src/org/jacoco/core/internal
parentfaf49f9418f7bc8f1a198de3afd941ff953d3abe (diff)
downloadjacoco-36b4e9c7103441d556a1667b4485960f5bdfeff8.tar.gz
Use condy for probes array in Java 11+ class files (#845)
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core/internal')
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/instr/CondyProbeArrayStrategy.java73
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java8
2 files changed, 81 insertions, 0 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/CondyProbeArrayStrategy.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/CondyProbeArrayStrategy.java
new file mode 100644
index 00000000..ca2fb60d
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/CondyProbeArrayStrategy.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2019 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.instr;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ConstantDynamic;
+import org.jacoco.core.runtime.IExecutionDataAccessorGenerator;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * This strategy for Java 11+ class files uses {@link ConstantDynamic} to hold
+ * the probe array and adds bootstrap method requesting the probe array from the
+ * runtime.
+ */
+public class CondyProbeArrayStrategy implements IProbeArrayStrategy {
+
+ /**
+ * Descriptor of the bootstrap method.
+ */
+ public static final String B_DESC = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)[Z";
+
+ private final String className;
+
+ private final boolean isInterface;
+
+ private final long classId;
+
+ private final IExecutionDataAccessorGenerator accessorGenerator;
+
+ CondyProbeArrayStrategy(final String className, final boolean isInterface,
+ final long classId,
+ final IExecutionDataAccessorGenerator accessorGenerator) {
+ this.className = className;
+ this.isInterface = isInterface;
+ this.classId = classId;
+ this.accessorGenerator = accessorGenerator;
+ }
+
+ public int storeInstance(final MethodVisitor mv, final boolean clinit,
+ final int variable) {
+ final Handle bootstrapMethod = new Handle(Opcodes.H_INVOKESTATIC,
+ className, InstrSupport.INITMETHOD_NAME, B_DESC, isInterface);
+ // As a workaround for https://bugs.openjdk.java.net/browse/JDK-8216970
+ // constant should have type Object
+ mv.visitLdcInsn(new ConstantDynamic(InstrSupport.DATAFIELD_NAME,
+ "Ljava/lang/Object;", bootstrapMethod));
+ mv.visitTypeInsn(Opcodes.CHECKCAST, "[Z");
+ mv.visitVarInsn(Opcodes.ASTORE, variable);
+ return 1;
+ }
+
+ public void addMembers(final ClassVisitor cv, final int probeCount) {
+ final MethodVisitor mv = cv.visitMethod(InstrSupport.INITMETHOD_ACC,
+ InstrSupport.INITMETHOD_NAME, B_DESC, null, null);
+ final int maxStack = accessorGenerator.generateDataAccessor(classId,
+ className, probeCount, mv);
+ mv.visitInsn(Opcodes.ARETURN);
+ mv.visitMaxs(maxStack, 3);
+ mv.visitEnd();
+ }
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java
index 0c668817..72c8dd68 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java
@@ -50,6 +50,10 @@ public final class ProbeArrayStrategyFactory {
if (counter.getCount() == 0) {
return new NoneProbeArrayStrategy();
}
+ if (version >= Opcodes.V11 && counter.hasMethods()) {
+ return new CondyProbeArrayStrategy(className, true, classId,
+ accessorGenerator);
+ }
if (version >= Opcodes.V1_8 && counter.hasMethods()) {
return new InterfaceFieldProbeArrayStrategy(className, classId,
counter.getCount(), accessorGenerator);
@@ -58,6 +62,10 @@ public final class ProbeArrayStrategyFactory {
counter.getCount(), accessorGenerator);
}
} else {
+ if (version >= Opcodes.V11) {
+ return new CondyProbeArrayStrategy(className, false, classId,
+ accessorGenerator);
+ }
return new ClassFieldProbeArrayStrategy(className, classId,
InstrSupport.needsFrames(version), accessorGenerator);
}