diff options
-rw-r--r-- | Readme.html | 4 | ||||
-rw-r--r-- | javassist.jar | bin | 679163 -> 680010 bytes | |||
-rw-r--r-- | src/main/javassist/bytecode/stackmap/MapMaker.java | 19 | ||||
-rw-r--r-- | src/test/javassist/JvstTest4.java | 10 | ||||
-rw-r--r-- | src/test/test4/JIRA186.java | 7 | ||||
-rw-r--r-- | src/test/test4/MultiCatch.java | 23 |
6 files changed, 57 insertions, 6 deletions
diff --git a/Readme.html b/Readme.html index a96638e8..a123d0f5 100644 --- a/Readme.html +++ b/Readme.html @@ -283,12 +283,12 @@ see javassist.Dump. <p>-version 3.18 <ul> -JIRA JASSIST-183, 189, 162. +JIRA JASSIST-183, 184, 189, 162, 186, 190. </ul> <p>-version 3.17.1 on December 3, 2012 <ul> - <li>JIRA JASSIST-177, 178, 182 + <li>JIRA JASSIST-177, 178, 182. </ul> diff --git a/javassist.jar b/javassist.jar Binary files differindex 5f207309..8ff2f083 100644 --- a/javassist.jar +++ b/javassist.jar diff --git a/src/main/javassist/bytecode/stackmap/MapMaker.java b/src/main/javassist/bytecode/stackmap/MapMaker.java index 9777ca20..e0aa5dac 100644 --- a/src/main/javassist/bytecode/stackmap/MapMaker.java +++ b/src/main/javassist/bytecode/stackmap/MapMaker.java @@ -18,6 +18,7 @@ package javassist.bytecode.stackmap; import java.util.ArrayList; import javassist.ClassPool; +import javassist.CtClass; import javassist.NotFoundException; import javassist.bytecode.*; @@ -205,8 +206,14 @@ public class MapMaker extends Tracer { { while (handler != null) { TypedBlock tb = (TypedBlock)handler.body; - if (tb.alreadySet()) + if (tb.alreadySet()) { mergeMap(tb, false); + if (tb.stackTop < 1) + throw new BadBytecode("bad catch clause: " + handler.typeIndex); + + tb.stackTypes[0] = merge(toExceptionType(handler.typeIndex), + tb.stackTypes[0]); + } else { recordStackMap(tb, handler.typeIndex); MapMaker maker = new MapMaker(this); @@ -256,14 +263,18 @@ public class MapMaker extends Tracer { throws BadBytecode { TypeData[] tStackTypes = TypeData.make(stackTypes.length); + tStackTypes[0] = toExceptionType(exceptionType).join(); + recordStackMap0(target, 1, tStackTypes); + } + + private TypeData.ClassName toExceptionType(int exceptionType) { String type; if (exceptionType == 0) // for finally clauses - type = "java.lang.Throwable"; + type= "java.lang.Throwable"; else type = cpool.getClassInfo(exceptionType); - tStackTypes[0] = new TypeData.ClassName(type); - recordStackMap0(target, 1, tStackTypes); + return new TypeData.ClassName(type); } private void recordStackMap0(TypedBlock target, int st, TypeData[] tStackTypes) diff --git a/src/test/javassist/JvstTest4.java b/src/test/javassist/JvstTest4.java index 768b7400..7692d5bc 100644 --- a/src/test/javassist/JvstTest4.java +++ b/src/test/javassist/JvstTest4.java @@ -828,4 +828,14 @@ public class JvstTest4 extends JvstTestRoot { Object obj = make(cc.getName()); assertEquals(1, invoke(obj, "test")); } + + // JASSIST-190 + public void testMultipleCatch() throws Exception { + CtClass cc = sloader.get("test4.MultiCatch"); + CtMethod m1 = cc.getDeclaredMethod("m1"); + m1.insertAfter("print();"); + cc.writeFile(); + Object obj = make(cc.getName()); + assertEquals(12, invoke(obj, "test1")); + } } diff --git a/src/test/test4/JIRA186.java b/src/test/test4/JIRA186.java new file mode 100644 index 00000000..41935a72 --- /dev/null +++ b/src/test/test4/JIRA186.java @@ -0,0 +1,7 @@ +package test4; + +public class JIRA186 { + public int test() { + return 1; + } +} diff --git a/src/test/test4/MultiCatch.java b/src/test/test4/MultiCatch.java new file mode 100644 index 00000000..142e3241 --- /dev/null +++ b/src/test/test4/MultiCatch.java @@ -0,0 +1,23 @@ +package test4; + +public class MultiCatch { + public void print() { System.out.println("MultiCatch"); } + public int test1() { return m1(1); } + public int m1(int i) { + // Java 7 syntax + try { + return foo(i); + } + catch (java.io.IOException | NullPointerException e) { + return e.getMessage().length(); + } + } + public int foo(int i) throws java.io.IOException { + if (i < 0) + throw new java.io.IOException("negative"); + else if (i < 10) + throw new NullPointerException("less than 10"); + else + return i; + } +} |