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}