172793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann/******************************************************************************* 2b9d1b54e300318b470d9fedccc69d75187016444Evgeny Mandrikov * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors 372793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * All rights reserved. This program and the accompanying materials 472793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * are made available under the terms of the Eclipse Public License v1.0 572793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * which accompanies this distribution, and is available at 672793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * http://www.eclipse.org/legal/epl-v10.html 772793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * 872793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * Contributors: 972793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * Marc R. Hoffmann - initial API and implementation 1072793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * 1172793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann *******************************************************************************/ 1272793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmannpackage org.jacoco.core.internal.instr; 1372793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 1472793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmannimport org.jacoco.core.runtime.IExecutionDataAccessorGenerator; 1572793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmannimport org.objectweb.asm.ClassVisitor; 1672793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmannimport org.objectweb.asm.MethodVisitor; 1772793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmannimport org.objectweb.asm.Opcodes; 1872793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 1972793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann/** 2072793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * The strategy for interfaces inlines the runtime access directly into the 2172793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * methods as this is the only method without keeping reference within this 2272793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * class. This is very inefficient as the runtime is contacted for every method 2372793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann * invocation and therefore only used for static initializers in interfaces. 2472793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann */ 2572793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmannclass LocalProbeArrayStrategy implements IProbeArrayStrategy { 2672793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 2772793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann private final String className; 2872793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann private final long classId; 2972793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann private final int probeCount; 3072793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann private final IExecutionDataAccessorGenerator accessorGenerator; 3172793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 3272793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann LocalProbeArrayStrategy(final String className, final long classId, 3372793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann final int probeCount, 3472793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann final IExecutionDataAccessorGenerator accessorGenerator) { 3572793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann this.className = className; 3672793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann this.classId = classId; 3772793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann this.probeCount = probeCount; 3872793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann this.accessorGenerator = accessorGenerator; 3972793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann } 4072793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 4128a112ca6c6f46cd385f00aa932ec0e334e045a7Evgeny Mandrikov public int storeInstance(final MethodVisitor mv, final boolean clinit, 4228a112ca6c6f46cd385f00aa932ec0e334e045a7Evgeny Mandrikov final int variable) { 4372793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann final int maxStack = accessorGenerator.generateDataAccessor(classId, 4472793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann className, probeCount, mv); 4572793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann mv.visitVarInsn(Opcodes.ASTORE, variable); 4672793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann return maxStack; 4772793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann } 4872793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 4972793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann public void addMembers(final ClassVisitor delegate, final int probeCount) { 5072793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann // nothing to do 5172793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann } 5272793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann 5372793f84314a393b86c5dc344499888b7113d20bMarc R. Hoffmann}