From 29a580826f0372878e786e8a60c2f69713db1ecc Mon Sep 17 00:00:00 2001 From: chibash Date: Mon, 27 May 2013 19:20:13 +0900 Subject: [PATCH] fixed JASSIST-195 --- Readme.html | 2 +- .../javassist/bytecode/stackmap/MapMaker.java | 27 +++++++++++++++++++ src/test/javassist/JvstTest4.java | 12 ++++++--- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Readme.html b/Readme.html index 2cc92bb9..f6936b0d 100644 --- a/Readme.html +++ b/Readme.html @@ -285,7 +285,7 @@ see javassist.Dump.

-version 3.17.1 on December 3, 2012 diff --git a/src/main/javassist/bytecode/stackmap/MapMaker.java b/src/main/javassist/bytecode/stackmap/MapMaker.java index e0aa5dac..16d3f294 100644 --- a/src/main/javassist/bytecode/stackmap/MapMaker.java +++ b/src/main/javassist/bytecode/stackmap/MapMaker.java @@ -162,6 +162,7 @@ public class MapMaker extends Tracer { throws BadBytecode { make(code, blocks[0]); + findDeadCatchers(code, blocks); try { fixTypes(code, blocks); } catch (NotFoundException e) { @@ -303,6 +304,32 @@ public class MapMaker extends Tracer { destTypes[i] = srcTypes[i]; } + // Phase 1.5 + + /* + * Javac may generate an exception handler that catches only an exception + * thrown within the handler itself. It is dead code. + */ + + private void findDeadCatchers(byte[] code, TypedBlock[] blocks) throws BadBytecode { + int len = blocks.length; + for (int i = 0; i < len; i++) { + TypedBlock block = blocks[i]; + if (block.localsTypes == null) { // if block is dead code + BasicBlock.Catch handler = block.toCatch; + while (handler != null) + if (handler.body == block) { + BasicBlock.Catch handler2 + = new BasicBlock.Catch(block, handler.typeIndex, null); + traceException(code, handler2); + break; + } + else + handler = handler.next; + } + } + } + // Phase 2 /* diff --git a/src/test/javassist/JvstTest4.java b/src/test/javassist/JvstTest4.java index fe1ab7e8..c7582c34 100644 --- a/src/test/javassist/JvstTest4.java +++ b/src/test/javassist/JvstTest4.java @@ -866,7 +866,13 @@ public class JvstTest4 extends JvstTestRoot { String s2 = field2.getAnnotation(test4.JIRA181.Condition2.class).toString(); assertEquals("@test4.JIRA181$Condition2(condition=test4.JIRA181.B[].class)", s2); } -} - - + public void testJIRA195() throws Exception { + CtClass cc = sloader.get("test4.JIRA195"); + CtMethod mth = cc.getDeclaredMethod("test"); + mth.getMethodInfo().rebuildStackMap(cc.getClassPool()); + cc.writeFile(); + Object obj = make(cc.getName()); + assertEquals(4, invoke(obj, "run")); + } +} -- 2.39.5