return 0;
}
};
code.assignIndices(callback);
DalvInsnList instructions= code.getInsns();
codeElement.setAttribute("register-size", String.valueOf(instructions.getRegistersSize()));
processLocals(instructions.getRegistersSize(), isStatic, parseClassName(cf.getThisClass().getClassType().getClassName()).toString(), meth.getPrototype().getParameterTypes(), codeElement);
Map<Integer, SwitchData> switchDataBlocks= extractSwitchData(instructions);
Map<Integer, ArrayData> arrayData= extractArrayData(instructions);
CatchTable catches= code.getCatches();
processCatchTable(catches, codeElement);
Map<Integer, Target> targets= extractTargets(instructions, catches);
// For each entry in the catch table, we create a try-catch element,
// including the try and all the catch children and append it to the
// code element. We store the try elements in a list, in order to
// append the matching instructions to them as they are processed.
List<Element> tryElements= new ArrayList<Element>();
Map<Integer, Element> tryCatchElements= new HashMap<Integer, Element>();
for (int i= 0; i < catches.size(); ++i)
{
Element tryCatchElement= new Element("try-catch", NS_DEX);
Element tryElement= new Element("try", NS_DEX);
tryCatchElement.addContent(tryElement);
tryElements.add(tryElement);
// For each handler create a catch element as the child of the
// try-catch element.
CatchHandlerList handlers= catches.get(i).getHandlers();
for (int j= 0; j < handlers.size(); ++j)
{
String exceptionType= handlers.get(j).getExceptionType().toHuman();
// We can remove the exception because a red type exception
// will never be created or thrown.
// This change is in sync with the one in processCatchTable
if (!isRedType(exceptionType))
{
Element catchElement= new Element("catch", NS_DEX);
catchElement.setAttribute("exception-type", exceptionType);
catchElement.setAttribute("target", String.valueOf(handlers.get(j).getHandler()));
tryCatchElement.addContent(catchElement);
}
}
tryCatchElements.put(catches.get(i).getStart(), tryCatchElement);
}
Element lastTryCatchElement= null;
// Used inside processInstruction to mark source file lines as
// already added, so they don't get added twice.
List<Integer> sourceLinesAlreadyPut= new ArrayList<Integer>();
// Process every single instruction of this method. Either add it do
// the main code element, or to a try-catch block.
for (int i= 0; i < instructions.size(); ++i)
{
Element instructionParent= codeElement;
DalvInsn instruction= instructions.get(i);
int address= instruction.getAddress();
// Determine whether to add the next instruction to the
// codeElement or to a try block.
Entry currentCatch= null;