/*
* 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.allocationcount;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOUBLE_QUOTE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_EMPTY;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SLASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOT;
import java.util.List;
import org.adoptopenjdk.jitwatch.jarscan.IJarScanOperation;
import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction;
import org.adoptopenjdk.jitwatch.model.bytecode.IBytecodeParam;
import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode;
import org.adoptopenjdk.jitwatch.model.bytecode.Opcode;
public class AllocationCountOperation implements IJarScanOperation
{
private InstructionAllocCountMap opcodeAllocCountMap;
private int limitPerAllocOpcode;
public AllocationCountOperation(int limit)
{
opcodeAllocCountMap = new InstructionAllocCountMap();
this.limitPerAllocOpcode = limit;
}
@Override
public String getReport()
{
return opcodeAllocCountMap.toString(limitPerAllocOpcode);
}
private void count(Opcode opcode, String type)
{
opcodeAllocCountMap.count(opcode, type);
}
@Override
public void processInstructions(String className, MemberBytecode memberBytecode)
{
List<BytecodeInstruction> instructions = memberBytecode.getInstructions();
for (BytecodeInstruction instruction : instructions)
{
Opcode opcode = instruction.getOpcode();
switch (opcode)
{
case NEWARRAY:
{
List<IBytecodeParam> params = instruction.getParameters();
String type = params.get(0).toString();
count(opcode, type);
}
break;
case ANEWARRAY:
case NEW:
case MULTIANEWARRAY:
{
String comment = instruction.getComment();
String type = comment.substring("// class ".length(), comment.length());
type = type.replace(S_DOUBLE_QUOTE, S_EMPTY).replace(S_SLASH, S_DOT);
count(opcode, type);
}
break;
default:
break;
}
}
}
}