Browse Source

fixed JASSIST-176

git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@677 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
tags/rel_3_17_1_ga
chiba 11 years ago
parent
commit
4453e36043

+ 1
- 1
Readme.html View File

@@ -284,7 +284,7 @@ see javassist.Dump.
<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

BIN
javassist.jar View File


+ 11
- 4
src/main/javassist/bytecode/stackmap/TypeData.java View File

@@ -388,17 +388,24 @@ public abstract class TypeData {
* 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);
}

+ 72
- 0
src/test/javassist/bytecode/StackMapTest.java View File

@@ -707,6 +707,78 @@ public class StackMapTest extends TestCase {
}
}

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");

Loading…
Cancel
Save