diff options
author | Evgeny Mandrikov <138671+Godin@users.noreply.github.com> | 2019-03-05 06:53:49 +0100 |
---|---|---|
committer | Marc R. Hoffmann <hoffmann@mountainminds.com> | 2019-03-05 06:53:49 +0100 |
commit | 36b4e9c7103441d556a1667b4485960f5bdfeff8 (patch) | |
tree | fdf32b3ba388e592850d6a2c5e7746b8491dcfe2 /org.jacoco.core/src/org/jacoco/core/internal | |
parent | faf49f9418f7bc8f1a198de3afd941ff953d3abe (diff) | |
download | jacoco-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.java | 73 | ||||
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java | 8 |
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); } |