Fix nested exception handlers

This commit is contained in:
Alexey Andreev 2017-11-15 22:39:52 +03:00
parent 23c25c5d6e
commit 105c188953
2 changed files with 27 additions and 5 deletions

View File

@ -493,8 +493,15 @@ public class Decompiler {
}
// Close old bookmarks
List<TryCatchBookmark> removedBookmarks = new ArrayList<>();
for (int i = tryCatchBookmarks.size() - 1; i >= start; --i) {
TryCatchBookmark bookmark = tryCatchBookmarks.get(i);
bookmark.block.tryCatches.remove(bookmark);
removedBookmarks.add(bookmark);
}
Collections.reverse(removedBookmarks);
for (TryCatchBookmark bookmark : removedBookmarks) {
Block block = stack.peek();
while (block != bookmark.block) {
TryCatchStatement tryCatchStmt = new TryCatchStatement();
@ -509,7 +516,6 @@ public class Decompiler {
}
block = block.parent;
}
TryCatchStatement tryCatchStmt = new TryCatchStatement();
tryCatchStmt.setExceptionType(bookmark.exceptionType);
tryCatchStmt.setExceptionVariable(bookmark.exceptionVariable);
@ -523,18 +529,15 @@ public class Decompiler {
if (!tryCatchStmt.getProtectedBody().isEmpty()) {
blockPart.add(tryCatchStmt);
}
bookmark.block.tryCatches.remove(bookmark);
}
tryCatchBookmarks.subList(start, tryCatchBookmarks.size()).clear();
}
private void createNewBookmarks(List<TryCatchBlock> tryCatchBlocks) {
// Add new bookmarks
for (int i = tryCatchBookmarks.size(); i < tryCatchBlocks.size(); ++i) {
TryCatchBlock tryCatch = tryCatchBlocks.get(i);
TryCatchBlock tryCatch = tryCatchBlocks.get(tryCatchBlocks.size() - 1 - i);
TryCatchBookmark bookmark = new TryCatchBookmark();
bookmark.block = stack.peek();
bookmark.offset = bookmark.block.body.size();

View File

@ -82,6 +82,25 @@ public class VMTest {
assertEquals(23, a);
}
@Test
public void emptyTryCatchInsideFinally() {
StringBuilder sb = new StringBuilder();
try {
sb.append("before;");
try {
sb.append("inside;");
Integer.parseInt("not a number");
sb.append("ignore;");
} catch (NumberFormatException e) {
// do nothing
}
sb.append("after;");
} finally {
sb.append("finally;");
}
assertEquals("before;inside;after;finally;", sb.toString());
}
@Test
public void surrogateInStringLiteralsWork() {
assertEquals(0xDDC2, "a\uDDC2b".charAt(1));