diff options
author | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2013-04-13 17:27:52 +0000 |
---|---|---|
committer | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2013-04-13 17:27:52 +0000 |
commit | fc4e2231b33404adea225df5a931db62619b1b12 (patch) | |
tree | 39262e0ff07e59c72f42240da5b59ea00f9959a9 /src | |
parent | d5500a2a6f5703f10a703ad6498e28c52c367104 (diff) | |
download | javassist-fc4e2231b33404adea225df5a931db62619b1b12.tar.gz javassist-fc4e2231b33404adea225df5a931db62619b1b12.zip |
fixed JASSIST-190
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@703 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src')
-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 |
4 files changed, 55 insertions, 4 deletions
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; + } +} |