ConsoleInterface an neue CompilerApi angepasst

RefType getBytecodeSignature  unterscheidet zwischen RefType und TypePlacholder
Abstrakte ByteCodeTest Klasse um getClassLoader erweitert
Alle BytecodeTypeTests angepasst
This commit is contained in:
Enrico Schrödter 2015-10-27 15:14:52 +01:00
parent 12093f2fc7
commit ce52fd8904
11 changed files with 250 additions and 29 deletions

View File

@ -7,6 +7,7 @@ import java.util.*;
import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.logger.LoggerConfiguration; import de.dhbwstuttgart.logger.LoggerConfiguration;
import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.typeinference.Menge;
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
@ -34,13 +35,13 @@ public class ConsoleInterface {
///////////////////////// /////////////////////////
// Parsen: // Parsen:
///////////////////////// /////////////////////////
compiler.parse(filenames); Menge<SourceFile> sourceFiles = compiler.parse(filenames);
///////////////////////// /////////////////////////
// Typrekonstruktion: // Typrekonstruktion:
///////////////////////// /////////////////////////
try{ try{
resultSet = compiler.typeReconstruction(); resultSet = compiler.typeReconstruction(sourceFiles);
}catch(TypeinferenceException texc){ }catch(TypeinferenceException texc){
texc.printStackTrace(); texc.printStackTrace();
fail("Fehler bei Typinferenzalgorithmus. Message: "+texc.getMessage()); fail("Fehler bei Typinferenzalgorithmus. Message: "+texc.getMessage());

View File

@ -869,7 +869,14 @@ public class RefType extends ObjectType implements IMatchable
sb.append(getName().toString().replace(".", "%")); sb.append(getName().toString().replace(".", "%"));
sb.append("%%"); sb.append("%%");
for(Type type: parameter){ for(Type type: parameter){
sb.append(((RefType) type).getCombinedType(cg).replace(".", "%")); if(type instanceof RefType){
sb.append(((RefType) type).getCombinedType(cg).replace(".", "%"));
}else if(type instanceof TypePlaceholder){
sb.append(((TypePlaceholder) type).getBytecodeType(cg).toString().replace(".", "%"));
}else{
sb.append(((TypePlaceholder) type).getBytecodeType(cg).toString().replace(".", "%"));
}
sb.append("%"); sb.append("%");
} }
}else{ }else{

View File

@ -39,11 +39,7 @@ public abstract class BytecodeTest extends TestCase{
protected Class getClassToTest(){ protected Class getClassToTest(){
Class classToTest = null; Class classToTest = null;
try { try {
File file = new File(rootDirectory); ClassLoader classLoader = getClassLoader();
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader classLoader = new URLClassLoader(urls);
classToTest = classLoader.loadClass(testName); classToTest = classLoader.loadClass(testName);
@ -54,4 +50,12 @@ public abstract class BytecodeTest extends TestCase{
return classToTest; return classToTest;
} }
protected ClassLoader getClassLoader() throws Exception{
File file = new File(System.getProperty("user.dir")+"/test/bytecode/types/");
URL url = file.toURL();
URL[] urls = new URL[]{url};
return new URLClassLoader(urls);
}
} }

View File

@ -34,7 +34,11 @@ public class ExtendsObjectTest extends BytecodeTest{
@Test @Test
public void testConstruct(){ public void testConstruct(){
try{ try{
Class cls = getClassToTest(); ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
Constructor method = cls.getConstructor(new Class[]{}); Constructor method = cls.getConstructor(new Class[]{});
method.newInstance(); method.newInstance();

View File

@ -33,7 +33,11 @@ public class ExtendsVectorStringTest extends BytecodeTest{
@Test @Test
public void testConstruct() throws Exception{ public void testConstruct() throws Exception{
Class cls = getClassToTest(); ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
Constructor method = cls.getConstructor(new Class[]{}); Constructor method = cls.getConstructor(new Class[]{});
method.newInstance(); method.newInstance();

View File

@ -34,7 +34,11 @@ public class ExtendsVectorTest extends BytecodeTest{
@Test @Test
public void testConstruct(){ public void testConstruct(){
try{ try{
Class cls = getClassToTest(); ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
Constructor method = cls.getConstructor(new Class[]{}); Constructor method = cls.getConstructor(new Class[]{});
method.newInstance(); method.newInstance();

View File

@ -24,15 +24,16 @@ public class OverloadingTest extends BytecodeTest{
@Test @Test
public void testString() { public void testString() {
try{ try{
Class cls = getClassToTest(); ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance(); Object obj = cls.newInstance();
File file = new File(rootDirectory); File file = new File(rootDirectory);
URL url = file.toURL(); URL url = file.toURL();
URL[] urls = new URL[]{url}; URL[] urls = new URL[]{url};
ClassLoader classLoader = new URLClassLoader(urls);
Class stringVector = classLoader.loadClass("java%util%Vector%%java%lang%String%"); Class stringVector = classLoader.loadClass("java%util%Vector%%java%lang%String%");
Class[] params = new Class[1]; Class[] params = new Class[1];
@ -49,14 +50,11 @@ public class OverloadingTest extends BytecodeTest{
@Test @Test
public void testInteger() { public void testInteger() {
try{ try{
Class cls = getClassToTest(); ClassLoader classLoader = getClassLoader();
Object obj = cls.newInstance();
File file = new File(rootDirectory);
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader classLoader = new URLClassLoader(urls); Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
Class integerVector = classLoader.loadClass("java%util%Vector%%java%lang%Integer%"); Class integerVector = classLoader.loadClass("java%util%Vector%%java%lang%Integer%");

View File

@ -0,0 +1,120 @@
package bytecode.types;
import static org.junit.Assert.*;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Stack;
import java.util.Vector;
import org.junit.Test;
import bytecode.BytecodeTest;
import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.logger.Section;
public class ReflectionTest{
@Test
public void testUntypedVectorDeclaredMethods() {
try{
File file = new File(System.getProperty("user.dir")+"/test/bytecode/types/");
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader classLoader = new URLClassLoader(urls);
Class untypedVectorTest = classLoader.loadClass("UntypedVector");
for(Method method: untypedVectorTest.getDeclaredMethods()){
System.out.println(method.toGenericString());
}
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Test
public void testUntypedVectorDeclaredMethodsCallMethod() {
try{
File file = new File(System.getProperty("user.dir")+"/test/bytecode/types/");
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader classLoader = new URLClassLoader(urls);
Class untypedVectorTest = classLoader.loadClass("UntypedVector");
Class stringVector = classLoader.loadClass("java%util%Vector%%java%lang%Object%");
Object stringVectorObj = stringVector.newInstance();
for(Method method: untypedVectorTest.getDeclaredMethods()){
method.invoke(untypedVectorTest.newInstance(), stringVectorObj);
}
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Test
public void testUntypedVectorMethod() {
try{
File file = new File(System.getProperty("user.dir")+"/test/bytecode/types/");
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader classLoader = new URLClassLoader(urls);
Class untypedVectorTest = classLoader.loadClass("UntypedVector");
Class stringVector = classLoader.loadClass("java%util%Vector%%java%lang%Object%");
Class[] params = new Class[1];
params[0] = stringVector;
Method method = untypedVectorTest.getDeclaredMethod("method", params);
method.invoke(untypedVectorTest.newInstance(), stringVector.newInstance());
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Test
public void testStdVectorAdd() {
try{
Vector<String> vector = new Vector<String>();
Class vectorClass = vector.getClass();
String helloWorld = new String("Hello World!");
Class[] params = new Class[1];
params[0] = new Object().getClass();
Method method = vectorClass.getDeclaredMethod("add", params);
method.invoke(vector, helloWorld);
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Test
public void testStdVectorEnsureCapacity() {
try{
Vector<String> vector = new Vector<String>();
Class vectorClass = vector.getClass();
Integer integer = new Integer(1);
Class[] params = new Class[1];
params[0] = int.class;
Method method = vectorClass.getDeclaredMethod("ensureCapacity", params);
method.invoke(vector, integer);
}catch(Exception e){
throw new RuntimeException(e);
}
}
}

View File

@ -2,7 +2,10 @@ package bytecode.types;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.io.File;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Stack; import java.util.Stack;
import java.util.Vector; import java.util.Vector;
@ -22,20 +25,21 @@ public class TypedVectorTest extends BytecodeTest{
@Test @Test
public void test() { public void test() {
try{ try{
Class cls = getClassToTest(); ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance(); Object obj = cls.newInstance();
Vector<String> stringVector = new Vector<String>(); Class stringVector = classLoader.loadClass("java%util%Vector%%java%lang%String%");
Class[] params = new Class[1]; Class[] params = new Class[1];
params[0] = stringVector.getClass(); params[0] = stringVector;
Method method = cls.getDeclaredMethod("method", params); Method method = cls.getDeclaredMethod("method", params);
method.invoke(obj, stringVector); method.invoke(obj, stringVector.newInstance());
assertTrue(true);
}catch(Exception e){ }catch(Exception e){
Logger.getLogger("SingleClassTester").error(e.toString(), Section.CODEGEN); throw new RuntimeException(e);
fail();
} }
} }
} }

View File

@ -0,0 +1,7 @@
import java.util.Vector;
class UntypedVector{
public void method(Vector v) {
}
}

View File

@ -0,0 +1,68 @@
package bytecode.types;
import static org.junit.Assert.*;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Stack;
import java.util.Vector;
import org.junit.Test;
import bytecode.BytecodeTest;
import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.logger.Section;
public class UntypedVectorTest extends BytecodeTest{
@Override
protected void init() {
testName = "UntypedVector";
rootDirectory = System.getProperty("user.dir")+"/test/bytecode/types/";
}
@Test
public void testObjectVector() {
try{
ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
File file = new File(rootDirectory);
URL url = file.toURL();
URL[] urls = new URL[]{url};
Object object = new Object();
Class[] params = new Class[1];
params[0] = object.getClass();
Method method = cls.getDeclaredMethod("method", params);
method.invoke(obj, object);
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Test
public void testGenericClass() {
try{
ClassLoader classLoader = getClassLoader();
Class untypedVectorTest = classLoader.loadClass(testName);
Class stringVector = classLoader.loadClass("java%util%Vector%%java%lang%Object%");
Class[] params = new Class[1];
params[0] = stringVector;
Method method = untypedVectorTest.getDeclaredMethod("method", params);
method.invoke(untypedVectorTest.newInstance(), stringVector.newInstance());
}catch(Exception e){
throw new RuntimeException(e);
}
}
}