package com.foursquare.heapaudit; import java.util.ArrayList; import org.objectweb.asm.Label; import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.LocalVariablesSorter; public class HeapVariables extends HeapUtil { public HeapVariables(int access, String desc, boolean debug, boolean trace, HeapMethod mv) { this.debug = debug; this.trace = trace; this.mv = mv.mv; this.lvs = new LocalVariablesSorter(access, desc, mv); } public int define(Type type, Label start, Label end) { int index = lvs.newLocal(type); log(debug, trace, mv, "\tDEFINE #" + index); variables.add(new Variable(index, type, start, end)); return index; } public void declare() { for (Variable variable: variables) { log(debug, trace, mv, "\tDECLARE #" + variable.index); mv.visitLocalVariable("$" + variable.index, variable.type.getDescriptor(), null, variable.start, variable.end, variable.index); } variables = null; } private final boolean debug; private final boolean trace; private final MethodAdapter mv; public final LocalVariablesSorter lvs; class Variable { public Variable(int index, Type type, Label start, Label end) { this.index = index; this.type = type; this.start = start; this.end = end; } public final int index; public final Type type; public final Label start; public final Label end; } private ArrayList<Variable> variables = new ArrayList<Variable>(); }