Commit 30cb84df authored by ebruneton's avatar ebruneton

fixed bug #315248

fixed bug in LocalVariablesSorter
parent 3b89bfdc
......@@ -181,7 +181,7 @@ public class LocalVariablesSorter extends MethodAdapter {
Object t = local[number];
int size = t == Opcodes.LONG || t == Opcodes.DOUBLE ? 2 : 1;
if (t != Opcodes.TOP) {
Type typ;
Type typ = OBJECT_TYPE;
if (t == Opcodes.INTEGER) {
typ = Type.INT_TYPE;
} else if (t == Opcodes.FLOAT) {
......@@ -190,7 +190,7 @@ public class LocalVariablesSorter extends MethodAdapter {
typ = Type.LONG_TYPE;
} else if (t == Opcodes.DOUBLE) {
typ = Type.DOUBLE_TYPE;
} else {
} else if (t instanceof String) {
typ = Type.getObjectType((String) t);
}
setFrameLocal(remap(index, typ), t);
......
......@@ -267,6 +267,9 @@ public class SimpleVerifier extends BasicVerifier {
if (getSuperClass(u) == null) {
return false;
} else {
if (isInterface) {
return u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY;
}
return isAssignableFrom(t, getSuperClass(u));
}
}
......@@ -284,7 +287,11 @@ public class SimpleVerifier extends BasicVerifier {
}
return false;
}
return getClass(t).isAssignableFrom(getClass(u));
Class tc = getClass(t);
if (tc.isInterface()) {
tc = Object.class;
}
return tc.isAssignableFrom(getClass(u));
}
protected Class getClass(final Type t) {
......
......@@ -215,7 +215,7 @@ public class CheckClassAdapter extends ClassAdapter {
SimpleVerifier verifier = new SimpleVerifier(Type.getObjectType(cn.name),
syperType,
interfaces,
false);
(cn.access | Opcodes.ACC_INTERFACE) != 0);
Analyzer a = new Analyzer(verifier);
if (loader != null) {
verifier.setClassLoader(loader);
......
/***
* ASM tests
* Copyright (c) 2002-2005 France Telecom
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.util;
import java.io.PrintWriter;
import java.io.StringWriter;
import junit.framework.TestSuite;
import org.objectweb.asm.AbstractTest;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
/**
* CheckClassAdapter tests.
*
* @author Eric Bruneton
*/
public class VerifyClassTest extends AbstractTest {
public static TestSuite suite() throws Exception {
return new VerifyClassTest().getSuite();
}
public void test() throws Exception {
if (n.startsWith("pkg.")) {
return;
}
ClassReader cr = new ClassReader(is);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
CheckClassAdapter.verify(cr, false, pw);
pw.close();
String s = sw.toString();
if (!s.isEmpty()) {
System.out.println("In class: " + n);
System.out.println(s);
}
assertTrue(s.isEmpty());
}
}
<project name="conform" default="test">
<target name="test">
<junit fork="yes"
printsummary="yes"
errorproperty="test.failed"
failureproperty="test.failed">
<batchtest fork="yes" todir="${out.test}/reports">
<fileset dir="${test}/conform">
<include name="**/VerifyClassTest.java"/>
</fileset>
</batchtest>
<formatter type="xml"/>
<classpath refid="test.classpath"/>
<jvmarg value="-Dasm.test=${asm.test}"/>
<jvmarg value="-Dasm.test.class=${asm.test.class}"/>
</junit>
</target>
</project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment