Bugfix: Store and Load

This commit is contained in:
Enrico Schrödter 2016-04-07 12:19:42 +02:00
parent 336dc52be6
commit 7b78cf8471
7 changed files with 66 additions and 44 deletions

View File

@ -2,6 +2,8 @@ package de.dhbwstuttgart.bytecode;
import java.awt.List; import java.awt.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.Constants;
import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.Attribute;
@ -32,6 +34,7 @@ public class DHBWInstructionFactory extends InstructionFactory{
private DHBWConstantPoolGen cp; private DHBWConstantPoolGen cp;
private ClassGenerator cg; private ClassGenerator cg;
private static Map<String, Integer> storeIndexes = new HashMap<>();
public DHBWInstructionFactory(ClassGenerator cg, DHBWConstantPoolGen cp) { public DHBWInstructionFactory(ClassGenerator cg, DHBWConstantPoolGen cp) {
super(cg, cp); super(cg, cp);
@ -137,8 +140,15 @@ public class DHBWInstructionFactory extends InstructionFactory{
} }
public LocalVariableInstruction createLoad(org.apache.commons.bcel6.generic.Type bytecodeType, String variableName) { public LocalVariableInstruction createLoad(org.apache.commons.bcel6.generic.Type bytecodeType, String variableName) {
int index = 1; //TODO: Hier muss ein Logger her, welcher aufzeichnet, an welcher Position welche Variable liegt. return InstructionFactory.createLoad(bytecodeType, storeIndexes.get(variableName));
return InstructionFactory.createLoad(bytecodeType, index); }
public Integer getStoreIndex(String variableName) {
if(!storeIndexes.containsKey(variableName)){
storeIndexes.put(variableName, storeIndexes.size()+1);
}
return storeIndexes.get(variableName);
} }
public static Type createObjectType() { public static Type createObjectType() {

View File

@ -183,8 +183,6 @@ public class FieldDeclaration extends Field{
if(wert != null){ if(wert != null){
il.append(this.wert.genByteCode(cg, rs)); il.append(this.wert.genByteCode(cg, rs));
}else{
//todo: default wert?
} }
FieldInstruction putFieldInstruction = FieldInstruction putFieldInstruction =

View File

@ -17,6 +17,7 @@ import org.apache.commons.bcel6.generic.LSTORE;
import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.typeinference.Menge;
import de.dhbwstuttgart.bytecode.ClassGenerator; import de.dhbwstuttgart.bytecode.ClassGenerator;
import de.dhbwstuttgart.bytecode.DHBWInstructionFactory;
import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.myexception.CTypeReconstructionException; import de.dhbwstuttgart.myexception.CTypeReconstructionException;
import de.dhbwstuttgart.myexception.JVMCodeException; import de.dhbwstuttgart.myexception.JVMCodeException;
@ -176,18 +177,12 @@ public class Assign extends Expr
return ret; return ret;
} }
public static int counterAssign = 0; //Zaehlvariable f<EFBFBD>r ISTORE
@Override @Override
public InstructionList genByteCode(ClassGenerator cg, TypeinferenceResultSet rs) { public InstructionList genByteCode(ClassGenerator cg, TypeinferenceResultSet rs) {
// TODO Auto-generated method stub DHBWInstructionFactory _factory = new DHBWInstructionFactory(cg, cg.getConstantPool());
InstructionFactory _factory = new InstructionFactory(cg, cg.getConstantPool());
InstructionList il = expr2.genByteCode(cg, rs);//expr2 rechte expr InstructionList il = expr2.genByteCode(cg, rs);//expr2 rechte expr
/* /*
String expr2Type = expr2.getType().get_Name().toString(); String expr2Type = expr2.getType().get_Name().toString();
switch(expr2Type){ switch(expr2Type){
@ -213,10 +208,7 @@ public class Assign extends Expr
} }
*/ */
//Es wird momentan immer von RefType ausgegangen: //Es wird momentan immer von RefType ausgegangen:
il.append(new ASTORE(counterAssign)); il.append(new ASTORE(_factory.getStoreIndex(expr1.get_Name())));
//TODO: ^^
counterAssign++; //macht STORE f<EFBFBD>r meherere Variable nutzbar (nicht nur ISTORE_1, ISTORE_2, etc.)
return il; return il;
} }

View File

@ -16,35 +16,6 @@ public class TypeinferenceResults {
} }
public TypeinferenceResults(Menge<TypeinferenceResultSet> typeReconstructions) { public TypeinferenceResults(Menge<TypeinferenceResultSet> typeReconstructions) {
//TODO: filter
int limit = typeReconstructions.size();
Logger.getLogger("TypeinferenceResults").error(new Integer(limit).toString(), Section.CODEGEN);
for(int i = 0; i < limit; i++){
Logger.getLogger("TypeinferenceResults").error(new Integer(i).toString(), Section.CODEGEN);
for(Pair p: typeReconstructions.get(i).getUnifiedConstraints()){
boolean flag = false;
Logger.getLogger("TypeinferenceResults").error(p.toString(), Section.CODEGEN);
if( p.TA1 instanceof SuperWildcardType ||
p.TA1 instanceof ExtendsWildcardType ||
p.TA2 instanceof SuperWildcardType ||
p.TA2 instanceof ExtendsWildcardType ||
flag){
Logger.getLogger("TypeinferenceResults").error("remove", Section.CODEGEN);
typeReconstructions.remove(i);
i--;
limit--;
flag = true;
}
}
}
this.typeReconstructions = typeReconstructions; this.typeReconstructions = typeReconstructions;
} }

View File

@ -9,4 +9,14 @@ class Overloading{
void method(Vector<Integer> v) { void method(Vector<Integer> v) {
} }
main(String[] args) {
ol;
ol = new Overloading();
v;
v = new Vector<String> ();
ol.method(v);
}
} }

View File

@ -0,0 +1,13 @@
import java.util.Vector;
class SuperType{
Vector<Number> numberVector;
void method() {
method(numberVector);
}
void method(Vector<? super Integer> v) {
}
}

View File

@ -0,0 +1,28 @@
package bytecode.types;
import static org.junit.Assert.*;
import org.junit.Test;
import bytecode.SourceFileBytecodeTest;
public class WildcardTest extends SourceFileBytecodeTest{
@Override
protected void init() {
testName = "Wildcard";
rootDirectory = System.getProperty("user.dir")+"/test/bytecode/types/";
}
@Test
public void testConstruct() throws Exception{
ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
assertTrue(true);
}
}