/* * Copyright (c) 2013-2016 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.jarscan.invokecount; import java.util.List; import org.adoptopenjdk.jitwatch.jarscan.IJarScanOperation; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction; import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode; import org.adoptopenjdk.jitwatch.model.bytecode.Opcode; import org.adoptopenjdk.jitwatch.util.ParseUtil; public class InvokeCountOperation implements IJarScanOperation { private InvokeMethodCountMap opcodeInvokeCountMap; private int limitPerInvoke; public InvokeCountOperation(int limitPerInvoke) { opcodeInvokeCountMap = new InvokeMethodCountMap(); this.limitPerInvoke = limitPerInvoke; } @Override public String getReport() { return opcodeInvokeCountMap.toString(limitPerInvoke); } private void count(String className, BytecodeInstruction instruction) { String comment = instruction.getCommentWithMemberPrefixStripped(); String methodSig = ParseUtil.bytecodeMethodCommentToReadableString(className, comment); opcodeInvokeCountMap.countInvocationOfMethod(instruction.getOpcode(), methodSig); } @Override public void processInstructions(String className, MemberBytecode memberBytecode) { List<BytecodeInstruction> instructions = memberBytecode.getInstructions(); for (BytecodeInstruction instruction : instructions) { Opcode opcode = instruction.getOpcode(); switch (opcode) { case INVOKEDYNAMIC: case INVOKEINTERFACE: case INVOKESPECIAL: case INVOKESTATIC: case INVOKEVIRTUAL: count(className, instruction); break; default: break; } } } }