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
This commit is contained in:
JesusFreke@JesusFreke.com 2009-05-16 18:04:50 +00:00
parent a77aba807f
commit 05700838d7
2 changed files with 44 additions and 1 deletions

View File

@ -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);

View File

@ -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<CodeItem.TryItem>, List<CodeItem.EncodedCatchHandler>> retVal = tryListBuilder.encodeTries(dexFile);
List<CodeItem.TryItem> 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<CodeItem.TryItem>, List<CodeItem.EncodedCatchHandler>> retVal = tryListBuilder.encodeTries(dexFile);
List<CodeItem.TryItem> 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[]{});
}
}