[jboss-cvs] javassist SVN: r677 - in trunk: src/main/javassist/bytecode/stackmap and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sun Nov 4 08:51:13 EST 2012


Author: chiba
Date: 2012-11-04 08:51:12 -0500 (Sun, 04 Nov 2012)
New Revision: 677

Modified:
   trunk/Readme.html
   trunk/javassist.jar
   trunk/src/main/javassist/bytecode/stackmap/TypeData.java
   trunk/src/test/javassist/bytecode/StackMapTest.java
Log:
fixed JASSIST-176

Modified: trunk/Readme.html
===================================================================
--- trunk/Readme.html	2012-10-25 16:38:40 UTC (rev 676)
+++ trunk/Readme.html	2012-11-04 13:51:12 UTC (rev 677)
@@ -284,7 +284,7 @@
 <p>-version 3.17
 <ul>
 	<li>OSGi bundle info is now included in the jar file.
-	<li>JIRA JASSIST-160, 163, 166, 168, 170, 171, 174, 175 have been fixed.
+	<li>JIRA JASSIST-160, 163, 166, 168, 170, 171, 174, 175, 176 have been fixed.
 </ul>
 
 <p>-version 3.16.1 on March 6, 2012

Modified: trunk/javassist.jar
===================================================================
(Binary files differ)

Modified: trunk/src/main/javassist/bytecode/stackmap/TypeData.java
===================================================================
--- trunk/src/main/javassist/bytecode/stackmap/TypeData.java	2012-10-25 16:38:40 UTC (rev 676)
+++ trunk/src/main/javassist/bytecode/stackmap/TypeData.java	2012-11-04 13:51:12 UTC (rev 677)
@@ -388,17 +388,24 @@
      * by considering array types.
      */
     public static CtClass commonSuperClassEx(CtClass one, CtClass two) throws NotFoundException {
-        if (one.isArray() && two.isArray()) {
+        if (one == two)
+            return one;
+        else if (one.isArray() && two.isArray()) {
             CtClass ele1 = one.getComponentType();
             CtClass ele2 = two.getComponentType();
-            CtClass element = commonSuperClassEx(ele1, ele2); 
+            CtClass element = commonSuperClassEx(ele1, ele2);
             if (element == ele1)
                 return one;
             else if (element == ele2)
                 return two;
-
-            return one.getClassPool().get(element.getName() + "[]");
+            else
+                return one.getClassPool().get(element == null ? "java.lang.Object"
+                                                : element.getName() + "[]");
         }
+        else if (one.isPrimitive() || two.isPrimitive())
+            return null;    // TOP
+        else if (one.isArray() || two.isArray())    // but !(one.isArray() && two.isArray()) 
+            return one.getClassPool().get("java.lang.Object");
         else
             return commonSuperClass(one, two);
     }

Modified: trunk/src/test/javassist/bytecode/StackMapTest.java
===================================================================
--- trunk/src/test/javassist/bytecode/StackMapTest.java	2012-10-25 16:38:40 UTC (rev 676)
+++ trunk/src/test/javassist/bytecode/StackMapTest.java	2012-11-04 13:51:12 UTC (rev 677)
@@ -707,6 +707,78 @@
         }
     }
 
+    public void testForHibernate() throws Exception {
+        ClassFile cf = loader.makeClass("javassist.bytecode.StackMapTestHibTest").getClassFile();
+        ConstPool cp = cf.getConstPool();
+        MethodInfo mi = new MethodInfo(cp, "foo", "()V");
+        Bytecode code = new Bytecode(cp, 0, 0);
+        code.add(Opcode.RETURN);
+        CodeAttribute ca = code.toCodeAttribute(); 
+        mi.addAttribute(ca);
+        cf.addMethod(mi);
+
+        int pc = 111;
+        int throwableType_index = cp.addClassInfo(Throwable.class.getName());
+
+        StackMapTable.Writer writer = new StackMapTable.Writer(32);
+        int[] localTags = { StackMapTable.OBJECT, StackMapTable.OBJECT, StackMapTable.OBJECT, StackMapTable.INTEGER };
+        int[] localData = { cp.getThisClassInfo(), cp.addClassInfo("java/lang/Object"),
+                            cp.addClassInfo("[Ljava/lang/Object;"), 0};
+        int[] stackTags = { StackMapTable.OBJECT };
+        int[] stackData = { throwableType_index };
+        writer.fullFrame(pc, localTags, localData, stackTags, stackData);
+
+        ca.setAttribute(writer.toStackMapTable(cp));
+        cf.write(new java.io.DataOutputStream(new java.io.FileOutputStream("./test-hibernate.class")));
+    }
+
+    public void testCommonSuperclass() throws Exception {
+        CtClass obj = loader.get("java.lang.Object");
+        CtClass objarray = loader.get("java.lang.Object[]");
+
+        CtClass one = loader.get("byte[]");
+        CtClass two = loader.get("byte[][]");
+        assertEquals("java.lang.Object", TypeData.commonSuperClassEx(one, two).getName());
+        assertTrue(one.subtypeOf(obj));
+        assertTrue(two.subtypeOf(obj));
+        assertFalse(one.subtypeOf(objarray));
+        assertTrue(two.subtypeOf(objarray));
+
+        one = loader.get("int[][]");
+        two = loader.get("java.lang.Object[]");
+        assertEquals("java.lang.Object[]", TypeData.commonSuperClassEx(one, two).getName());
+        assertTrue(one.subtypeOf(objarray));
+        assertTrue(two.subtypeOf(objarray));
+
+        one = loader.get("int[]");
+        two = loader.get("java.lang.String");
+        assertEquals("java.lang.Object", TypeData.commonSuperClassEx(one, two).getName());
+        assertTrue(one.subtypeOf(obj));
+        assertTrue(two.subtypeOf(obj));
+        assertFalse(one.subtypeOf(objarray));
+        assertFalse(two.subtypeOf(objarray));
+
+        one = loader.get("int[]");
+        two = loader.get("int[]");
+        assertEquals("int[]", TypeData.commonSuperClassEx(one, two).getName());
+        assertTrue(one.subtypeOf(obj));
+        assertFalse(one.subtypeOf(objarray));
+
+        one = loader.get("int[]");
+        two = loader.get("java.lang.String[]");
+        assertEquals("java.lang.Object", TypeData.commonSuperClassEx(one, two).getName());
+        assertTrue(one.subtypeOf(obj));
+        assertTrue(two.subtypeOf(obj));
+        assertFalse(one.subtypeOf(objarray));
+        assertTrue(two.subtypeOf(objarray));
+
+        one = loader.get("java.lang.String[]");
+        two = loader.get("java.lang.Class[]");
+        assertEquals("java.lang.Object[]", TypeData.commonSuperClassEx(one, two).getName());
+        assertTrue(one.subtypeOf(objarray));
+        assertTrue(two.subtypeOf(objarray));
+    }
+
     public void tstCtClassType() throws Exception {
         ClassPool cp = ClassPool.getDefault();
         CtClass cc = cp.get("javassist.CtClassType");



More information about the jboss-cvs-commits mailing list