diff --git a/src/main/java/org/JesusFreke/dexlib/util/TryListBuilder.java b/src/main/java/org/JesusFreke/dexlib/util/TryListBuilder.java index 3f4c411a..0995667b 100644 --- a/src/main/java/org/JesusFreke/dexlib/util/TryListBuilder.java +++ b/src/main/java/org/JesusFreke/dexlib/util/TryListBuilder.java @@ -202,7 +202,10 @@ public class TryListBuilder tryRange = newRange; } - tryRange.catchAllHandlerAddress = handlerAddress; + if (tryRange.catchAllHandlerAddress == -1) { + tryRange.catchAllHandlerAddress = handlerAddress; + } + previousEnd = tryRange.endAddress; tryRange = tryRange.next; } while (tryRange.previous != endRange); diff --git a/src/test/java/TryListBuilderTest.java b/src/test/java/TryListBuilderTest.java index 08a65d35..4c2e83e7 100644 --- a/src/test/java/TryListBuilderTest.java +++ b/src/test/java/TryListBuilderTest.java @@ -425,6 +425,46 @@ public class TryListBuilderTest checkTry(tries.get(4), 10, 12, -1, new Handler[]{handler3}); } + @Test + public void catchAllTest1() { + //|-----| + // |---| + TryListBuilder tryListBuilder = new TryListBuilder(); + + DexFile dexFile = DexFile.makeBlankDexFile(); + + tryListBuilder.addCatchAllHandler(2, 8, 100); + tryListBuilder.addCatchAllHandler(4, 6, 101); + + Pair, List> retVal = tryListBuilder.encodeTries(dexFile); + List tries = retVal.first; + + Assert.assertTrue(tries.size() == 3); + checkTry(tries.get(0), 2, 4, 100, new Handler[]{}); + checkTry(tries.get(1), 4, 6, 100, new Handler[]{}); + checkTry(tries.get(2), 6, 8, 100, new Handler[]{}); + } + + @Test + public void catchAllTest2() { + // |---| + //|-----| + TryListBuilder tryListBuilder = new TryListBuilder(); + + DexFile dexFile = DexFile.makeBlankDexFile(); + + tryListBuilder.addCatchAllHandler(4, 6, 100); + tryListBuilder.addCatchAllHandler(2, 8, 101); + + Pair, List> retVal = tryListBuilder.encodeTries(dexFile); + List tries = retVal.first; + + Assert.assertTrue(tries.size() == 3); + checkTry(tries.get(0), 2, 4, 101, new Handler[]{}); + checkTry(tries.get(1), 4, 6, 100, new Handler[]{}); + checkTry(tries.get(2), 6, 8, 101, new Handler[]{}); + } + }