aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Readme.html4
-rw-r--r--javassist.jarbin679163 -> 680010 bytes
-rw-r--r--src/main/javassist/bytecode/stackmap/MapMaker.java19
-rw-r--r--src/test/javassist/JvstTest4.java10
-rw-r--r--src/test/test4/JIRA186.java7
-rw-r--r--src/test/test4/MultiCatch.java23
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
index 5f207309..8ff2f083 100644
--- a/javassist.jar
+++ b/javassist.jar
Binary files differ
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;
+ }
+}