From 05700838d7f1c72ff88ebf1e6a804b4eae87dc3e Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sat, 16 May 2009 18:04:50 +0000 Subject: [PATCH] Changed the functionality of TryListBuilder so that when adding a catch-all handler, existing catch-all handlers take priority over the catch-all handler being added. git-svn-id: https://smali.googlecode.com/svn/trunk@40 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../dexlib/util/TryListBuilder.java | 5 ++- src/test/java/TryListBuilderTest.java | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) 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[]{}); + } + }