From ab73502b60fadc966ba3ace0aa4b62592cf2ae86 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 14 Apr 2013 18:36:05 -0700 Subject: [PATCH] Massage the try blocks before writing them out to a dex file --- .../java/org/jf/dexlib2/writer/CodeItemPool.java | 3 ++- .../org/jf/dexlib2/writer/util/TryListBuilder.java | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/CodeItemPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/CodeItemPool.java index 3a67ad3f..d430f13e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/CodeItemPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/CodeItemPool.java @@ -46,6 +46,7 @@ import org.jf.dexlib2.iface.reference.*; import org.jf.dexlib2.util.MethodUtil; import org.jf.dexlib2.util.ReferenceUtil; import org.jf.dexlib2.writer.util.InstructionWriteUtil; +import org.jf.dexlib2.writer.util.TryListBuilder; import org.jf.util.ExceptionWithContext; import javax.annotation.Nonnull; @@ -152,7 +153,7 @@ public class CodeItemPool { InstructionWriteUtil instrWriteUtil = new InstructionWriteUtil(methodImpl, dexFile.stringPool); writer.writeUshort(instrWriteUtil.getOutParamCount()); - List tryBlocks = methodImpl.getTryBlocks(); + List tryBlocks = TryListBuilder.massageTryBlocks(methodImpl.getTryBlocks()); writer.writeUshort(tryBlocks.size()); writer.writeInt(dexFile.debugInfoPool.getOffset(method)); writer.writeInt(instrWriteUtil.getCodeUnitCount()); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java index e8c256cd..a153100c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java @@ -62,6 +62,20 @@ public class TryListBuilder listEnd.prev = listStart; } + public static List massageTryBlocks(List tryBlocks) { + TryListBuilder tlb = new TryListBuilder(); + for (TryBlock tryBlock: tryBlocks) { + int startAddress = tryBlock.getStartCodeAddress(); + int endAddress = startAddress + tryBlock.getCodeUnitCount(); + + for (ExceptionHandler exceptionHandler: tryBlock.getExceptionHandlers()) { + tlb.addHandler(exceptionHandler.getExceptionType(), startAddress, endAddress, + exceptionHandler.getHandlerCodeAddress()); + } + } + return tlb.getTryBlocks(); + } + private static class TryBounds { @Nonnull public final MutableTryBlock start; @Nonnull public final MutableTryBlock end;