try {
final int startOffset = cm.getCodeStart().getOffset();
final int size = cm.getCodeEnd().getOffset() - startOffset;
final byte[] code = new byte[size];
System.arraycopy(os.getBytes(), startOffset, code, 0, size);
final Address codePtr = VmMagic.getArrayData(code);
final NativeStream.ObjectRef defExHRef = cm
.getDefExceptionHandler();
final Address defExHandler;
if (defExHRef != null) {
defExHandler = codePtr.add(cm.getDefExceptionHandler()
.getOffset()
- startOffset);
} else {
defExHandler = Address.zero();
}
final VmCompiledExceptionHandler[] eTable;
final VmAddressMap aTable = cm.getAddressTable();
final VmByteCode bc = method.getBytecode();
final CompiledExceptionHandler[] ceh = cm.getExceptionHandlers();
if (ceh != null) {
eTable = new VmCompiledExceptionHandler[ceh.length];
for (int i = 0; i < ceh.length; i++) {
final VmConstClass catchType = bc.getExceptionHandler(i)
.getCatchType();
final Address startPtr = codePtr.add(ceh[i].getStartPc()
.getOffset()
- startOffset);
final Address endPtr = codePtr.add(ceh[i].getEndPc()
.getOffset()
- startOffset);
final Address handler = codePtr.add(ceh[i].getHandler()
.getOffset()
- startOffset);
eTable[i] = new VmCompiledExceptionHandler(catchType,
startPtr.toAddress(), endPtr.toAddress(), handler
.toAddress());
}
} else {
eTable = null;
}