Merge, ObjectClass anfügen
This commit is contained in:
commit
85dc60169a
93
src/de/dhbwstuttgart/bytecode/BytecodeTypeFactory.java
Normal file
93
src/de/dhbwstuttgart/bytecode/BytecodeTypeFactory.java
Normal file
@ -0,0 +1,93 @@
|
||||
package de.dhbwstuttgart.bytecode;
|
||||
|
||||
import de.dhbwstuttgart.syntaxtree.type.BoundedGenericTypeVar;
|
||||
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
|
||||
import de.dhbwstuttgart.syntaxtree.type.ObjectType;
|
||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||
import de.dhbwstuttgart.syntaxtree.type.Type;
|
||||
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
||||
|
||||
public class BytecodeTypeFactory {
|
||||
|
||||
/**
|
||||
* @see https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-FieldType
|
||||
*/
|
||||
public static String generateFieldDescriptor(Type t){
|
||||
String ret = "";
|
||||
if(t instanceof RefType){
|
||||
ret += "L" + t.getName().toString().replace('.', '/') + ";";
|
||||
}else{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-ClassSignature
|
||||
*/
|
||||
public static String generateClassSignature(de.dhbwstuttgart.syntaxtree.Class c){
|
||||
String ret = "";
|
||||
if(c.getGenericParameter() != null && c.getGenericParameter().size() > 0){
|
||||
ret += "<";
|
||||
for(GenericTypeVar gtv : c.getGenericParameter()){
|
||||
ret += generateTypeParameter(gtv);
|
||||
}
|
||||
ret += ">";
|
||||
}
|
||||
//Add the SuperClassSignature:
|
||||
c.getSuperClass();
|
||||
ret += generateClassTypeSignature();
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static String generateSuperClassSignature(Type superClass){
|
||||
String ret = "";
|
||||
//TODO:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private static String generateTypeParameter(GenericTypeVar gtv){
|
||||
String ret = gtv.get_Name() + ":";
|
||||
for(ObjectType t : gtv.getBounds()){
|
||||
ret += generateReferenceTypeSignature(t);
|
||||
ret += ":";
|
||||
}
|
||||
ret = ret.substring(0, ret.length()-1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-ClassTypeSignature
|
||||
*/
|
||||
private static String generateClassTypeSignature(){
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-ReferenceTypeSignature
|
||||
*/
|
||||
private static String generateReferenceTypeSignature(Type t){
|
||||
if(t instanceof RefType)return generateReferenceTypeSignature((RefType)t);
|
||||
if(t instanceof GenericTypeVar)return generateReferenceTypeSignature((GenericTypeVar)t);
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private static String generateReferenceTypeSignature(RefType t){
|
||||
String ret = "L" + t.get_Name();
|
||||
if(t.getParaList() != null && t.getParaList().size() > 0){
|
||||
ret += "<";
|
||||
for(Type p : t.getParaList()){
|
||||
ret += generateReferenceTypeSignature(p);
|
||||
}
|
||||
ret+=">";
|
||||
}
|
||||
return ret + ";";
|
||||
}
|
||||
|
||||
private static String generateReferenceTypeSignature(GenericTypeVar t){
|
||||
String ret = "T" + t.get_Name();
|
||||
return ret + ";";
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -20,6 +20,8 @@ import org.apache.bcel.classfile.Signature;
|
||||
import org.apache.bcel.generic.ClassGen;
|
||||
import org.apache.bcel.generic.ConstantPoolGen;
|
||||
|
||||
import de.dhbwstuttgart.parser.JavaClassName;
|
||||
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
|
||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||
import de.dhbwstuttgart.syntaxtree.type.Type;
|
||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||
@ -36,6 +38,7 @@ public class ClassGenerator extends ClassGen{
|
||||
private TypeinferenceResults tiResult;
|
||||
private int lambdaMethodeNr = 0;
|
||||
private Type superClass;
|
||||
private List<GenericTypeVar> generics;
|
||||
|
||||
private Menge<TypePlaceholder> usedTPHs = new Menge<>();
|
||||
|
||||
@ -43,11 +46,14 @@ public class ClassGenerator extends ClassGen{
|
||||
private List<String> methodsNamesAndTypes = new LinkedList<>();
|
||||
private MethodGenerator methodGenerator;
|
||||
|
||||
public ClassGenerator(String name, Type superClass, String string, short accessflags, String[] strings, TypeinferenceResults typeinferenceResults) {
|
||||
super(name,superClass.get_Name(),string,accessflags,strings, new DHBWConstantPoolGen());
|
||||
this.tiResult = typeinferenceResults;
|
||||
public ClassGenerator(JavaClassName name, Type superClass, List<GenericTypeVar> generics,
|
||||
String sourceFileName, short accessflags, String[] implementedInterfaces, TypeinferenceResults rs) {
|
||||
super(name.toString(),superClass.get_Name(),sourceFileName,accessflags,implementedInterfaces, new DHBWConstantPoolGen());
|
||||
//this.tiResult = typeinferenceResultSet;
|
||||
this.superClass = superClass;
|
||||
this.generics = generics;
|
||||
|
||||
tiResult = rs;
|
||||
cp = (DHBWConstantPoolGen) super.getConstantPool();
|
||||
factory = new DHBWInstructionFactory(this, cp);
|
||||
this.setMajor(52); //Java 8 Version 52.0
|
||||
@ -62,7 +68,7 @@ public class ClassGenerator extends ClassGen{
|
||||
* Versucht einen Type zu finden von dem dieser TPH ein Subtyp sein muss.
|
||||
* @param toTPH
|
||||
* @return Es gilt dann "toTPH extends Type"
|
||||
*/
|
||||
|
||||
public org.apache.bcel.generic.Type getNearestUsedType(Type t, Menge<TypePlaceholder> usedTypes){
|
||||
if(t == null){
|
||||
return this.getInstructionFactory().createObjectType();
|
||||
@ -70,13 +76,13 @@ public class ClassGenerator extends ClassGen{
|
||||
//return getNearestType((TypePlaceholder) t);
|
||||
return new TypePlaceholderType((TypePlaceholder) t);
|
||||
}else{
|
||||
return t.getBytecodeType(this, getTypeinferenceResults().getTypeReconstructions().get(0));
|
||||
return t.getBytecodeType(this, getTypeinferenceResultSet().getTypeReconstructions().get(0));
|
||||
}
|
||||
}
|
||||
public org.apache.bcel.generic.Type getNearestUsedType(TypePlaceholder toTPH){
|
||||
return this.getNearestUsedType(toTPH, null);
|
||||
}
|
||||
|
||||
*/
|
||||
public String createLambdaMethodName() {
|
||||
return "lambda$methode$"+(lambdaMethodeNr++);
|
||||
}
|
||||
@ -152,8 +158,19 @@ public class ClassGenerator extends ClassGen{
|
||||
|
||||
//Signatur setzen:
|
||||
String typeParameters = this.generateParameterSignature();
|
||||
String superClassSignature = this.superClass.getBytecodeSignature(this, null);
|
||||
String classSignature = typeParameters + superClassSignature;
|
||||
String superClassSignature = BytecodeTypeFactory.generateSuperClassSignature(this.superClass);//"L" + this.superClass.getBytecodeType(cg, rs)
|
||||
superClassSignature = superClassSignature.substring(0, superClassSignature.length()-1); //Das ";" am Ende entfernen
|
||||
if(this.superClass instanceof RefType &&
|
||||
((RefType)superClass).get_ParaList() != null &&
|
||||
((RefType)superClass).get_ParaList().size() > 0){
|
||||
superClassSignature += "<";
|
||||
RefType superRefType = (RefType) this.superClass;
|
||||
for(Type param : superRefType.get_ParaList()){
|
||||
superClassSignature += param.getBytecodeSignature(this, null);
|
||||
}
|
||||
superClassSignature += ">;";
|
||||
}
|
||||
String classSignature = typeParameters + superClassSignature; //TOOD: Hier noch die Signaturen der SuperInterfaces anfügen
|
||||
if(classSignature.length()>0){
|
||||
this.addAttribute(new Signature(cp.addUtf8("Signature"),2,cp.addUtf8(classSignature),cp.getConstantPool()));
|
||||
}
|
||||
@ -178,6 +195,16 @@ public class ClassGenerator extends ClassGen{
|
||||
|
||||
private String generateParameterSignature(){
|
||||
String ret = "";
|
||||
//ret += "L" + this.getClassName().replace(".", "/") + ";";
|
||||
if(this.generics != null && this.generics.size() > 0){
|
||||
ret += "<";
|
||||
for(GenericTypeVar gtv : this.generics){
|
||||
ret += gtv.getBytecodeSignature(this, tiResult.getTypeReconstructions().get(0));
|
||||
}
|
||||
ret += ">";
|
||||
}
|
||||
|
||||
/*
|
||||
if(this.getUsedTPH().size()>0){
|
||||
ret += "<";
|
||||
Iterator<TypePlaceholder> it = ((Menge<TypePlaceholder>)this.getUsedTPH().clone()).iterator();
|
||||
@ -185,10 +212,11 @@ public class ClassGenerator extends ClassGen{
|
||||
TypePlaceholder tph = it.next();
|
||||
//ret += tph.getBytecodeMethodSignature(this);
|
||||
//ret += ":";
|
||||
ret += tph.getClassSignature(this, getTypeinferenceResults().getTypeReconstructions().get(0));
|
||||
ret += tph.getClassSignature(this, null); //Es wird null übergeben. Die ClassSignaturen dürfen von keinem ResultSet abhängen.
|
||||
}
|
||||
ret += ">";
|
||||
}
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -199,11 +227,12 @@ public class ClassGenerator extends ClassGen{
|
||||
public Map<String, ClassGenerator> getExtraClasses() {
|
||||
return extraClasses;
|
||||
}
|
||||
|
||||
public TypeinferenceResults getTypeinferenceResults() {
|
||||
/*
|
||||
public TypeinferenceResults getTypeinferenceResultSet() {
|
||||
return tiResult;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@Override
|
||||
public void addMethod(Method m) {
|
||||
//TODO: Die Prüfung, ob Methode bereits vorhanden vor die Bytecodegenerierung verlegen (Beispielsweise in Method)
|
||||
@ -225,4 +254,5 @@ public class ClassGenerator extends ClassGen{
|
||||
return methodGenerator;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ public class MyCompiler implements MyCompilerAPI{
|
||||
* Fun0-FunN (momentan für N = 6)
|
||||
* @return
|
||||
*/
|
||||
private TypeAssumptions makeFunNAssumptions(){
|
||||
public static TypeAssumptions makeFunNAssumptions(){
|
||||
TypeAssumptions ret = new TypeAssumptions();
|
||||
|
||||
//Basic Assumptions für die FunN Interfaces:
|
||||
|
@ -72,7 +72,8 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
protected static Logger parserlog = Logger.getLogger("parser");
|
||||
protected UsedId pkgName;
|
||||
protected Modifiers modifiers;
|
||||
protected String name;
|
||||
protected JavaClassName name;
|
||||
protected List<RefType> implementedInterfaces = new ArrayList<>();
|
||||
|
||||
/**
|
||||
*
|
||||
@ -90,8 +91,10 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
logger.debug("Test");
|
||||
|
||||
if(pkgName != null)throw new NotImplementedException();
|
||||
short constants = Constants.ACC_PUBLIC; //Per Definition ist jede Methode public
|
||||
_cg = new ClassGenerator(name, this.getSuperClass(), name + ".java", constants , new String[] { }, typeinferenceResults); //letzter Parameter sind implementierte Interfaces
|
||||
short constants = Const.ACC_PUBLIC; //Per Definition ist jede Methode public
|
||||
if(isInterface())constants+=Const.ACC_INTERFACE;
|
||||
|
||||
_cg = new ClassGenerator(name, this.getSuperClass(), this.getGenericParameter(), name + ".java", constants , new String[] { }, typeinferenceResults); //letzter Parameter sind implementierte Interfaces
|
||||
_cp = _cg.getConstantPool();
|
||||
_factory = new DHBWInstructionFactory(_cg, _cp);
|
||||
|
||||
@ -105,12 +108,14 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
if(field instanceof FieldDeclaration)fieldDeclarations.add((FieldDeclaration)field);
|
||||
//field.genByteCode(_cg);
|
||||
}
|
||||
|
||||
//Zuerst die Methoden und Felder abarbeiten:
|
||||
for(Method m : methods){
|
||||
m.genByteCode(_cg, this);
|
||||
m.genByteCode(_cg, this, typeinferenceResults);
|
||||
}
|
||||
InstructionList fieldInitializations = new InstructionList();
|
||||
for(FieldDeclaration f : fieldDeclarations){
|
||||
//Die Felder können noch nicht überladen werden. Hier ist nur die erste der Lösungen möglich:
|
||||
fieldInitializations.append(f.genByteCode(_cg, typeinferenceResults.getTypeReconstructions().get(0)));
|
||||
}
|
||||
//Die Konstruktoren müssen die Feld initialisierungswerte beinhalten:
|
||||
@ -137,7 +142,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
}
|
||||
public void setName(String strName)
|
||||
{
|
||||
name = strName;
|
||||
name = new JavaClassName(strName);
|
||||
}
|
||||
public void setModifiers(Modifiers mod)
|
||||
{
|
||||
@ -194,7 +199,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
|
||||
public Class(String name, int offset)
|
||||
{
|
||||
this.name = name;
|
||||
this.name = new JavaClassName(name);
|
||||
if(name.equals("java.lang.Object")){
|
||||
superclassid=null;
|
||||
}
|
||||
@ -202,8 +207,18 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
if(!name.equals("Object") && !name.equals("java.lang.Object"))//Alle Klassen auÃer Object erben von Object:
|
||||
this.superClass = new ObjectClass().getType();
|
||||
}
|
||||
// ino.end
|
||||
|
||||
public Class(JavaClassName name, List<Method> methoden, List<Field> felder, Modifiers modifier,
|
||||
boolean isInterface, RefType superClass, List<RefType> implementedInterfaces,
|
||||
GenericDeclarationList generics, int offset){
|
||||
this(name.toString(), superClass, modifier, new Menge<>());
|
||||
this.implementedInterfaces = implementedInterfaces;
|
||||
this.offset = offset;
|
||||
this.isInterface = isInterface;
|
||||
this.isInterface();
|
||||
this.genericClassParameters = generics;
|
||||
}
|
||||
|
||||
/**
|
||||
* Erstellt eine Klasse, welche nur für die Assumptions verwendet wird.
|
||||
* Sie enthält keine unnötigen Informationen, wie Offset oder ClassBody.
|
||||
@ -694,7 +709,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
{
|
||||
//return superclassid.toString() + body.toString();
|
||||
//geaendert PL 07-07-28
|
||||
return name;
|
||||
return name.toString();
|
||||
}
|
||||
// ino.end
|
||||
|
||||
@ -896,7 +911,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!constructorVorhanden){//Falls kein Konstruktor vorhanden ist, muss noch der Standardkonstruktor angefügt werden:
|
||||
if(!constructorVorhanden && ! isInterface()){//Falls kein Konstruktor vorhanden ist, muss noch der Standardkonstruktor angefügt werden:
|
||||
Block konstruktorBlock = new Block();
|
||||
konstruktorBlock.statements.add(new SuperCall(konstruktorBlock));
|
||||
Constructor standardKonstruktor = new Constructor(Method.createEmptyMethod(konstruktorBlock,this.getName().toString(), this), this);
|
||||
@ -1008,10 +1023,10 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean isInterface;
|
||||
public boolean isInterface(){
|
||||
return false;
|
||||
return isInterface;
|
||||
}
|
||||
|
||||
/*
|
||||
private Collection<? extends ByteCodeResult> getGenericClasses() {
|
||||
Collection<ByteCodeResult> results = new Menge<>();
|
||||
|
@ -28,6 +28,7 @@ import de.dhbwstuttgart.typeinference.ConstraintsSet;
|
||||
import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
||||
import de.dhbwstuttgart.typeinference.ResultSet;
|
||||
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
|
||||
import de.dhbwstuttgart.typeinference.TypeinferenceResults;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.ConstructorAssumption;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.ParameterAssumption;
|
||||
@ -65,7 +66,9 @@ public class Constructor extends Method {
|
||||
InstructionList il = new InstructionList(); //sollte nicht new sein sondern aus Block kommen
|
||||
Class parentClass = this.getParentClass();
|
||||
|
||||
MethodGenerator method = new MethodGenerator(Constants.ACC_PUBLIC, this.getType().getBytecodeType(cg, null), this.parameterlist.getBytecodeTypeList(cg,null) , this.parameterlist.getParameterNameArray(), "<init>", parentClass.name, il, _cp);
|
||||
MethodGenerator method = new MethodGenerator(Constants.ACC_PUBLIC,
|
||||
this.getType().getBytecodeType(cg, null), this.parameterlist.getBytecodeTypeList(cg,null),
|
||||
this.parameterlist.getParameterNameArray(), "<init>", parentClass.name.toString(), il, _cp);
|
||||
|
||||
//FieldInitializations an Block anfügen
|
||||
Block block = this.get_Block();
|
||||
@ -96,7 +99,7 @@ public class Constructor extends Method {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void genByteCode(ClassGenerator cg, Class classObj) {
|
||||
public void genByteCode(ClassGenerator cg, Class classObj, TypeinferenceResults resultSets) {
|
||||
this.genByteCode(cg, new InstructionList());
|
||||
}
|
||||
// super statement muss drin sein
|
||||
|
@ -190,11 +190,5 @@ public class FieldDeclaration extends Field{
|
||||
il.append(putFieldInstruction );
|
||||
return il;
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public void genByteCode(ClassGen cg) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}*/
|
||||
|
||||
}
|
||||
|
@ -21,6 +21,10 @@ public class GenericDeclarationList extends SyntaxTreeNode implements Iterable<G
|
||||
private int offsetOfLastElement;
|
||||
private Menge<GenericTypeVar> gtvs = new Menge<>();
|
||||
|
||||
public GenericDeclarationList(){
|
||||
this(new Menge<GenericTypeVar>(), -1);
|
||||
}
|
||||
|
||||
public GenericDeclarationList(Menge<GenericTypeVar> values, int endOffset) {
|
||||
this.addAll(values);
|
||||
this.offsetOfLastElement = endOffset;
|
||||
|
@ -44,6 +44,7 @@ import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
||||
import de.dhbwstuttgart.typeinference.ResultSet;
|
||||
import de.dhbwstuttgart.typeinference.TypeInsertable;
|
||||
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
|
||||
import de.dhbwstuttgart.typeinference.TypeinferenceResults;
|
||||
import de.dhbwstuttgart.typeinference.UndConstraint;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.ParameterAssumption;
|
||||
@ -80,7 +81,8 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
|
||||
super(offset);
|
||||
}
|
||||
|
||||
public Method(String name, Type returnType, ParameterList parameterList, Block block, GenericDeclarationList gtvDeclarations, int offset) {
|
||||
public Method(String name, Type returnType, ParameterList parameterList, Block block,
|
||||
GenericDeclarationList gtvDeclarations, int offset) {
|
||||
this(offset);
|
||||
/*
|
||||
* if(parameterList != null)parameterList.parserPostProcessing(this);
|
||||
@ -396,15 +398,15 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
|
||||
return super.equals(obj);
|
||||
}
|
||||
|
||||
public void genByteCode(ClassGenerator cg, Class classObj) {
|
||||
List<TypeinferenceResultSet> typeInterferenceResults = cg.getTypeinferenceResults().getTypeReconstructions(this, cg);
|
||||
public void genByteCode(ClassGenerator cg, Class classObj, TypeinferenceResults resultSets) {
|
||||
List<TypeinferenceResultSet> typeInterferenceResults = resultSets.getTypeReconstructions(this, cg);
|
||||
DHBWInstructionFactory _factory = cg.getInstructionFactory();
|
||||
|
||||
for(TypeinferenceResultSet t: typeInterferenceResults){
|
||||
addMethodToClassGenerator(cg, _factory, t);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void addMethodToClassGenerator(ClassGenerator cg, DHBWInstructionFactory _factory, TypeinferenceResultSet t) {
|
||||
DHBWConstantPoolGen _cp = cg.getConstantPool();
|
||||
InstructionList il = new InstructionList();
|
||||
@ -421,7 +423,10 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
|
||||
|
||||
Type returnType = this.getType();
|
||||
|
||||
MethodGenerator method = new MethodGenerator(constants, returnType.getBytecodeType(cg, t), argumentTypes.toArray(new org.apache.bcel.generic.Type[parameterlist.size()]) , argumentNames.toArray(new String[parameterlist.size()]), this.get_Method_Name(), getParentClass().name, il, _cp);
|
||||
MethodGenerator method = new MethodGenerator(constants, returnType.getBytecodeType(cg, t),
|
||||
argumentTypes.toArray(new org.apache.bcel.generic.Type[parameterlist.size()]) ,
|
||||
argumentNames.toArray(new String[parameterlist.size()]), this.get_Method_Name(),
|
||||
getParentClass().name.toString(), il, _cp);
|
||||
|
||||
cg.setMethodeGenerator(method);
|
||||
|
||||
|
@ -707,227 +707,6 @@ public class SourceFile
|
||||
}
|
||||
//}
|
||||
}
|
||||
// ino.end
|
||||
|
||||
|
||||
// ino.method.makeBasicAssumptions.21418.defdescription type=javadoc
|
||||
/**
|
||||
* Erzeugt die Anfangsinformationen �ber bereits bekannte Klassen.
|
||||
* <br/>Achtung Workaround: Die RefTypes m�ssen sp�ter noch durch BaseTypes
|
||||
* ersetzt werden. <br>
|
||||
* Author: J�rg B�uerle
|
||||
*
|
||||
* @return A priori Typinformationen
|
||||
* @throws ClassNotFoundException
|
||||
*/
|
||||
// ino.end
|
||||
// ino.method.makeBasicAssumptions.21418.definition
|
||||
private TypeAssumptions makeBasicAssumptions()
|
||||
// ino.end
|
||||
// ino.method.makeBasicAssumptions.21418.body
|
||||
{
|
||||
/*
|
||||
if(LOAD_BASIC_ASSUMPTIONS_FROM_JRE){
|
||||
|
||||
Menge<UsedId> strImports=new Menge<UsedId>();
|
||||
ImportDeclarations usedIdImports=getImports();
|
||||
for(int i=0;i<usedIdImports.size();i++){
|
||||
UsedId uid=usedIdImports.get(i);
|
||||
if(uid.hasWildCard()){
|
||||
throw new CTypeReconstructionException("Wildcards in den Imports werden bislang nicht unterstuetzt: "+uid.getQualifiedName(),uid);
|
||||
|
||||
//throw new ClassNotFoundException("Bei den Imports sind momentan keine Wildcards erlaubt!");
|
||||
}else{
|
||||
strImports.addElement(uid);
|
||||
}
|
||||
}
|
||||
TypeinferenceResultSet res=makeBasicAssumptionsFromJRE(strImports);
|
||||
|
||||
ImportDeclarations newImports=new ImportDeclarations();
|
||||
for(int i=0;i<strImports.size();i++){
|
||||
newImports.addElement(strImports.get(i));
|
||||
}
|
||||
setImports(newImports);
|
||||
|
||||
return(res);
|
||||
}
|
||||
|
||||
|
||||
TypeinferenceResultSet foo = new TypeinferenceResultSet(null);
|
||||
CMethodTypeAssumption meth = null;
|
||||
CInstVarTypeAssumption instVar = null;
|
||||
Class c = null;
|
||||
UsedId ui = null;
|
||||
//Menge pl = null;
|
||||
|
||||
Modifiers mod = new Modifiers();
|
||||
mod.addModifier(new Public());
|
||||
|
||||
//------------------------
|
||||
// Integer bauen:
|
||||
//------------------------
|
||||
foo.addClassName("java.lang.Integer"); //PL 05-08-01 eingefuegt
|
||||
instVar = new CInstVarTypeAssumption("java.lang.Integer", "MAX_VALUE", new RefType("java.lang.Integer",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>());
|
||||
foo.addFieldOrLocalVarAssumption(instVar);
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Integer", 0), "<init>", new RefType("java.lang.Integer",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Integer", 0), "<init>", new RefType("java.lang.Integer",-1),1, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
meth.addParaAssumption(new CParaTypeAssumption("java.lang.Integer", "<init>", 1, 0,"value", new RefType("java.lang.Integer",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>()));
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Integer", 0), "intValue", new RefType("java.lang.Integer",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
|
||||
|
||||
c = new BasicAssumptionClass("java.lang.Integer", mod);
|
||||
|
||||
// ui = new UsedId();
|
||||
// ui.set_Name("Super-Class-Blub");
|
||||
// c.set_UsedId(ui);
|
||||
// pl = new Menge();
|
||||
// pl.addElement(new GenericTypeVar("bla"));
|
||||
// c.set_ParaList(pl);
|
||||
this.addElement(c);
|
||||
|
||||
//------------------------
|
||||
// Boolean bauen:
|
||||
//------------------------
|
||||
foo.addClassName("java.lang.Boolean"); //PL 05-08-01 eingefuegt
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Boolean", 0), "<init>", new RefType("java.lang.Boolean",-1),0, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Boolean", 0), "<init>", new RefType("java.lang.Boolean",-1), 1,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
meth.addParaAssumption(new CParaTypeAssumption("java.lang.Boolean", "<init>", 1, 0, "value", new RefType("java.lang.Boolean",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>()));
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Boolean", 0), "booleanValue", new RefType("java.lang.Boolean",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
c = new BasicAssumptionClass("java.lang.Boolean", mod);
|
||||
|
||||
// ui = new UsedId();
|
||||
// ui.set_Name("Super-Class-Blub");
|
||||
// c.set_UsedId(ui);
|
||||
// pl = new Menge();
|
||||
// pl.addElement(new GenericTypeVar("bla"));
|
||||
// c.set_ParaList(pl);
|
||||
this.addElement(c);
|
||||
|
||||
//------------------------
|
||||
// Character bauen:
|
||||
//------------------------
|
||||
foo.addClassName("java.lang.Character"); //PL 05-08-01 eingefuegt
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Character", 0), "<init>", new RefType("java.lang.Character",-1),0, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Character", 0), "<init>", new RefType("java.lang.Character",-1),1, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
meth.addParaAssumption(new CParaTypeAssumption("java.lang.Character", "<init>", 1, 0,"value", new RefType("java.lang.Character",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>()));
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Character", 0), "charValue", new BooleanType(),0, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
c = new BasicAssumptionClass("java.lang.Character", mod);
|
||||
|
||||
// ui = new UsedId();
|
||||
// ui.set_Name("Super-Class-Blub");
|
||||
// c.set_UsedId(ui);
|
||||
// pl = new Menge();
|
||||
// pl.addElement(new GenericTypeVar("bla"));
|
||||
// c.set_ParaList(pl);
|
||||
this.addElement(c);
|
||||
|
||||
//------------------------
|
||||
// Menge bauen:
|
||||
//------------------------
|
||||
foo.addClassName("java.lang.Menge"); //PL 05-08-01 eingefuegt
|
||||
TypePlaceholder E = TypePlaceholder.fresh(); // Sp�ter ersetzen durch GenericTypeVar
|
||||
Menge<GenericTypeVar> typeGenPara = new Menge<GenericTypeVar>();
|
||||
typeGenPara.addElement(new GenericTypeVar(E.getName(),-1));
|
||||
foo.addGenericTypeVars("java.lang.Menge", typeGenPara);
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Menge", 0), "elementAt", new GenericTypeVar(E.getName(),-1), 1,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
meth.addParaAssumption(new CParaTypeAssumption("java.lang.Menge", "elementAt", 1, 0, "index", new RefType("java.lang.Integer",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>()));
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Menge", 0), "addElement", new Void(-1),1, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
meth.addParaAssumption(new CParaTypeAssumption("java.lang.Menge", "addElement", 1, 0,"element", new GenericTypeVar(E.getName(),-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>()));
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
meth = new CMethodTypeAssumption(new RefType("java.lang.Menge", 0), "size", new RefType("java.lang.Integer",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Menge<Integer>(),null);
|
||||
foo.addMethodIntersectionType(new CIntersectionType(meth));
|
||||
|
||||
c = new BasicAssumptionClass("java.lang.Menge", mod);
|
||||
|
||||
// ui = new UsedId();
|
||||
// ui.set_Name("Super-Class-Blub");
|
||||
// c.set_UsedId(ui);
|
||||
// pl = new Menge();
|
||||
// pl.addElement(E);
|
||||
// c.set_ParaList(pl);
|
||||
this.addElement(c);
|
||||
|
||||
//------------------------
|
||||
// Stack bauen:
|
||||
//------------------------
|
||||
foo.addClassName("java.lang.Stack"); //PL 05-08-01 eingefuegt
|
||||
c = new BasicAssumptionClass("java.lang.Stack", mod);
|
||||
ui = new UsedId(-1);
|
||||
ui.set_Name("java.lang.Menge");
|
||||
c.set_UsedId(ui);
|
||||
// pl = new Menge();
|
||||
// pl.addElement(E);
|
||||
// c.set_ParaList(pl);
|
||||
this.addElement(c);
|
||||
|
||||
return foo;
|
||||
*/
|
||||
TypeAssumptions ret = new TypeAssumptions();
|
||||
|
||||
//Basic Assumptions für die FunN Interfaces:
|
||||
//TODO: Hier mehr als Fun1-Fun5 implementieren
|
||||
for(int i = 0; i<6; i++){
|
||||
FunNInterface funN = new FunNInterface(i);
|
||||
ret.add(funN.getPublicFieldAssumptions());
|
||||
}
|
||||
|
||||
return ret; //TODO: Diese TypeAssumptions mit basic-Assumptions füllen
|
||||
}
|
||||
// ino.end
|
||||
|
||||
// ino.method.setImports.21421.definition
|
||||
private void setImports(ImportDeclarations newImports)
|
||||
// ino.end
|
||||
// ino.method.setImports.21421.body
|
||||
{
|
||||
this.imports=newImports;
|
||||
|
||||
}
|
||||
// ino.end
|
||||
|
||||
|
||||
// ino.method.removeBasicAssumptions.21424.defdescription type=javadoc
|
||||
/**
|
||||
* L�scht die Anfangsinformation wieder aus dem Klassenvektor
|
||||
* <br/>Author: J�rg B�uerle
|
||||
*/
|
||||
// ino.end
|
||||
// ino.method.removeBasicAssumptions.21424.definition
|
||||
private void removeBasicAssumptions()
|
||||
// ino.end
|
||||
// ino.method.removeBasicAssumptions.21424.body
|
||||
{
|
||||
for(int i=0; i<KlassenVektor.size(); i++){
|
||||
Class cl = KlassenVektor.elementAt(i);
|
||||
if(cl instanceof BasicAssumptionClass){
|
||||
KlassenVektor.removeElementAt(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
// ino.end
|
||||
|
||||
// ino.method.getPackageName.21427.defdescription type=javadoc
|
||||
/**
|
||||
@ -1065,7 +844,7 @@ public class SourceFile
|
||||
}
|
||||
|
||||
/**
|
||||
* Bisher wird nur der Bytecode der Klassen generiert. Nicht der Interfaces.
|
||||
* Bytecode generieren für das resultSet
|
||||
* @return
|
||||
*/
|
||||
public Menge<ByteCodeResult> generateBytecode(TypeinferenceResults results) {
|
||||
@ -1073,6 +852,22 @@ public class SourceFile
|
||||
for(Class cl : this.KlassenVektor){
|
||||
ret.add(cl.genByteCode(results));
|
||||
}
|
||||
//Alle FunN Klassen erzeugen:
|
||||
for(ClassAssumption funNAss : MyCompiler.makeFunNAssumptions().getClassAssumptions()){
|
||||
ret.add(funNAss.getAssumedClass().genByteCode(results));
|
||||
}
|
||||
/*
|
||||
//Add all FunN Interfaces
|
||||
for(Pair ucons : results.getUnifiedConstraints()){
|
||||
for(Type t : ucons.getTypes()){
|
||||
List<Class> xClasses = t.isClassFromJavaX();
|
||||
for(Class xClass : xClasses){
|
||||
ByteCodeResult bC = xClass.genByteCode(results);
|
||||
if(! ret.contains(bC))ret.add(bC);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,14 @@
|
||||
package de.dhbwstuttgart.syntaxtree.factory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.dhbwstuttgart.bytecode.ClassGenerator;
|
||||
import de.dhbwstuttgart.parser.JavaClassName;
|
||||
import de.dhbwstuttgart.syntaxtree.Class;
|
||||
import de.dhbwstuttgart.syntaxtree.Constructor;
|
||||
import de.dhbwstuttgart.syntaxtree.Field;
|
||||
import de.dhbwstuttgart.syntaxtree.GenericDeclarationList;
|
||||
import de.dhbwstuttgart.syntaxtree.Method;
|
||||
import de.dhbwstuttgart.syntaxtree.ObjectClass;
|
||||
import de.dhbwstuttgart.syntaxtree.ParameterList;
|
||||
@ -56,6 +62,7 @@ public class ASTFactory {
|
||||
return new Constructor(method, superClass);
|
||||
}
|
||||
|
||||
/*
|
||||
public static Class createClass(String className, RefType type, Modifiers modifiers, Menge supertypeGenPara, SourceFile parent) {
|
||||
// TODO bytecode createClass
|
||||
//String name, RefType superClass, Modifiers modifiers, Menge<String> supertypeGenPara
|
||||
@ -66,10 +73,21 @@ public class ASTFactory {
|
||||
|
||||
return generatedClass;
|
||||
}
|
||||
|
||||
public static Class createObjectClass() {
|
||||
Class generatedClass = new ObjectClass();
|
||||
|
||||
*/
|
||||
public static Class createInterface(String className, RefType superClass, Modifiers modifiers,
|
||||
Menge supertypeGenPara, SourceFile parent){
|
||||
Class generatedClass = new Class(new JavaClassName(className), new ArrayList<Method>(), new ArrayList<Field>(), modifiers,
|
||||
true, superClass, new ArrayList<RefType>(), new GenericDeclarationList(), -1);
|
||||
generatedClass.parserPostProcessing(parent);
|
||||
return generatedClass;
|
||||
}
|
||||
|
||||
public static Class createObjectClass() {
|
||||
Class generatedClass = new ObjectClass();
|
||||
return generatedClass;
|
||||
}
|
||||
|
||||
public static RefType createObjectType(){
|
||||
return createObjectClass().getType();
|
||||
}
|
||||
}
|
||||
|
81
src/de/dhbwstuttgart/syntaxtree/factory/NameGenerator.java
Normal file
81
src/de/dhbwstuttgart/syntaxtree/factory/NameGenerator.java
Normal file
@ -0,0 +1,81 @@
|
||||
package de.dhbwstuttgart.syntaxtree.factory;
|
||||
|
||||
public class NameGenerator {
|
||||
|
||||
private static String strNextName = "A";
|
||||
|
||||
/**
|
||||
* Berechnet einen neuen, eindeutigen Namen f�r eine neue
|
||||
* <code>TypePlaceholder</code>. <br>Author: J�rg B�uerle
|
||||
* @return Der Name
|
||||
*/
|
||||
public static String makeNewName()
|
||||
{
|
||||
// otth: Funktion berechnet einen neuen Namen anhand eines alten gespeicherten
|
||||
String strReturn = strNextName;
|
||||
|
||||
// n�chster Name berechnen und in strNextName speichern
|
||||
inc( strNextName.length() - 1 );
|
||||
|
||||
return strReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hilfsfunktion zur Berechnung eines neuen Namens
|
||||
* <br>Author: J�rg B�uerle
|
||||
* @param i
|
||||
*/
|
||||
private static void inc(int i)
|
||||
{
|
||||
// otth: Hilfsfunktion zur Berechnung eines neuen Namens
|
||||
// otth: Erh�hung des Buchstabens an der Stelle i im String strNextName
|
||||
// otth: Nach �berlauf: rekursiver Aufruf
|
||||
|
||||
// falls i = -1 --> neuer Buchstabe vorne anf�gen
|
||||
if ( i == -1 )
|
||||
{
|
||||
strNextName = "A" + strNextName;
|
||||
return;
|
||||
}
|
||||
|
||||
char cBuchstabe = (char)(strNextName.charAt( i ));
|
||||
cBuchstabe++;
|
||||
if ( cBuchstabe - 65 > 25 )
|
||||
{
|
||||
// aktuelle Stelle: auf A zuruecksetzen
|
||||
manipulate( i, 'A' );
|
||||
|
||||
// vorherige Stelle erh�hen
|
||||
inc( i - 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// aktueller Buchstabe �ndern
|
||||
manipulate( i, cBuchstabe );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Hilfsfunktion zur Berechnung eines neuen Namens.
|
||||
* <br>Author: J�rg B�uerle
|
||||
* @param nStelle
|
||||
* @param nWert
|
||||
*/
|
||||
private static void manipulate( int nStelle, char nWert )
|
||||
{
|
||||
// otth: Hilfsfunktion zur Berechnung eines neuen Namens
|
||||
// otth: Ersetzt im String 'strNextName' an der Position 'nStelle' den Buchstaben durch 'nWert'
|
||||
|
||||
String strTemp = "";
|
||||
for( int i = 0; i < strNextName.length(); i++)
|
||||
{
|
||||
if ( i == nStelle )
|
||||
strTemp = strTemp + nWert;
|
||||
else
|
||||
strTemp = strTemp + strNextName.charAt( i );
|
||||
}
|
||||
strNextName = strTemp;
|
||||
}
|
||||
|
||||
}
|
@ -307,7 +307,7 @@ public class LambdaExpression extends Expr{
|
||||
String interfaceMethodName = "apply"; //Das ist ein Hack, funktioniert momentan, da nur FunN Interfaces für LambdaAusdrücke funktionieren
|
||||
|
||||
//String invokeDynamicType = org.apache.bcel.generic.Type.getMethodSignature(lambdaType.getBytecodeType(cg, rs), additionalParameters);
|
||||
String invokeDynamicType = org.apache.bcel.generic.Type.getMethodSignature(new org.apache.bcel.generic.ObjectType(lambdaType.get_Name()), additionalParameters);
|
||||
String invokeDynamicType = org.apache.bcel.generic.Type.getMethodSignature(lambdaType.getBytecodeType(cg, rs), additionalParameters);
|
||||
il.append(cg.getInstructionFactory().createInvokeDynamic(interfaceMethodName,invokeDynamicType, bMethod));
|
||||
|
||||
return il;
|
||||
|
@ -160,11 +160,12 @@ public class LocalOrFieldVarOrClassname extends Expr
|
||||
public InstructionList genByteCode(ClassGenerator cg, TypeinferenceResultSet rs) {
|
||||
InstructionList il = new InstructionList();
|
||||
if(this.isFieldAccess){
|
||||
il.append(new This(this).genByteCode(cg, rs));
|
||||
il.append(cg.getInstructionFactory().createFieldAccess(this.getParentClass().getName().toString(), this.get_Name(), this.getType().getBytecodeType(cg, rs), Constants.GETFIELD));
|
||||
}else{
|
||||
il.append(createLoad(cg, rs));
|
||||
}
|
||||
|
||||
il.append(createLoad(cg, rs));
|
||||
|
||||
return il;
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ package de.dhbwstuttgart.syntaxtree.statement;
|
||||
// ino.module.MethodCall.8639.import
|
||||
import java.util.Hashtable;
|
||||
|
||||
import org.apache.bcel.Const;
|
||||
import org.apache.bcel.Constants;
|
||||
import org.apache.bcel.generic.ClassGen;
|
||||
import org.apache.bcel.generic.InstructionFactory;
|
||||
@ -333,9 +334,9 @@ public class MethodCall extends Expr
|
||||
de.dhbwstuttgart.syntaxtree.Class receiverClass = this.receiver.getReceiverClass(cg, rs);
|
||||
short kind = 0;
|
||||
if(receiverClass.isInterface()){
|
||||
kind = Constants.INVOKEINTERFACE;
|
||||
kind = Const.INVOKEINTERFACE;
|
||||
}else{//Ansonsten muss es eine Klasse sein:
|
||||
kind = Constants.INVOKEVIRTUAL;
|
||||
kind = Const.INVOKEVIRTUAL;
|
||||
}
|
||||
|
||||
org.apache.bcel.generic.Type[] argumentTypen = org.apache.bcel.generic.Type.NO_ARGS;
|
||||
@ -353,7 +354,10 @@ public class MethodCall extends Expr
|
||||
}
|
||||
|
||||
org.apache.bcel.generic.Type returnType = this.getType().getBytecodeType(cg, rs);
|
||||
il.append(_factory.createInvoke(receiver.getReceiverClass(cg, rs).getName().toString(), this.get_Name(), returnType , argumentTypen, kind));
|
||||
il.append(_factory.createInvoke(
|
||||
receiver.get_Expr().getType().getBytecodeType(cg, rs).toString(),
|
||||
//receiver.getReceiverClass(cg, rs).getBytecodeType(cg, rs).toString(),
|
||||
this.get_Name(), returnType , argumentTypen, kind));
|
||||
return il;
|
||||
}
|
||||
|
||||
|
@ -122,5 +122,6 @@ public class Receiver
|
||||
public JavaCodeResult printJavaCode(ResultSet resultSet) {
|
||||
return new JavaCodeResult().attach(this.get_Expr().printJavaCode(resultSet));
|
||||
}
|
||||
|
||||
}
|
||||
// ino.end
|
||||
|
@ -13,6 +13,7 @@ import de.dhbwstuttgart.parser.JavaClassName;
|
||||
import de.dhbwstuttgart.syntaxtree.Method;
|
||||
import de.dhbwstuttgart.syntaxtree.ParameterList;
|
||||
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
||||
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption;
|
||||
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
|
||||
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
|
||||
@ -50,18 +51,19 @@ public class FunN extends RefType {
|
||||
|
||||
/**
|
||||
* Spezieller Konstruktor um eine FunN ohne Returntype zu generieren
|
||||
*/
|
||||
|
||||
protected FunN(List<? extends Type> list){
|
||||
super("",null,0);
|
||||
if(list==null)throw new NullPointerException();
|
||||
setT(list);
|
||||
this.name = new JavaClassName("Fun"+list.size());//getName();
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Erstellt eine FunN:
|
||||
* FunN<R, T1, ..., TparameterCount>
|
||||
* R und T1 - TparameterCount werden mit TypePlaceholdern besetzt.
|
||||
* R und T1 - TparameterCount werden mit GenericTypeVars besetzt.
|
||||
* @param parameterCount
|
||||
*/
|
||||
public FunN(int parameterCount) {
|
||||
@ -69,14 +71,15 @@ public class FunN extends RefType {
|
||||
if(parameterCount<0)throw new RuntimeException("Anzahl der Parameter muss >0 sein");
|
||||
Menge<Type> t = new Menge<Type>();
|
||||
for(int i=0;i<parameterCount;i++){
|
||||
t.add(TypePlaceholder.fresh(this));
|
||||
//t.add(TypePlaceholder.fresh(this));
|
||||
t.add(new GenericTypeVar(NameGenerator.makeNewName(), this, -1));
|
||||
}
|
||||
setR(TypePlaceholder.fresh(this));
|
||||
setR(new GenericTypeVar(NameGenerator.makeNewName(), this, -1));
|
||||
setT(t);
|
||||
|
||||
this.name = new JavaClassName("Fun"+parameterCount);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Muss nach jeder Ãnderung von T oder R aufgerufen werden.
|
||||
* Dabei werden bestimmte, von RefType geerbte, Parameter angepasst. Dies ist wichtig für den Typinferenzalgorithmus.
|
||||
|
@ -30,7 +30,9 @@ public class FunVoidN extends FunN {
|
||||
* @return
|
||||
*/
|
||||
public FunVoidN(Menge<Type> T) {
|
||||
super(T);
|
||||
super(T.size());
|
||||
this.setR(new Void(this, -1));
|
||||
this.setT(T);
|
||||
this.name = new JavaClassName("FunVoid"+T.size());
|
||||
}
|
||||
|
||||
|
@ -2,9 +2,12 @@
|
||||
package de.dhbwstuttgart.syntaxtree.type;
|
||||
// ino.end
|
||||
|
||||
import java.util.ArrayList;
|
||||
// ino.module.GenericTypeVar.8671.import
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import de.dhbwstuttgart.typeinference.Menge;
|
||||
|
||||
import de.dhbwstuttgart.typeinference.ConstraintsSet;
|
||||
@ -22,17 +25,14 @@ import de.dhbwstuttgart.parser.JavaClassName;
|
||||
import de.dhbwstuttgart.syntaxtree.Class;
|
||||
import de.dhbwstuttgart.syntaxtree.GTVDeclarationContext;
|
||||
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
||||
// ino.class.GenericTypeVar.26505.description type=javadoc
|
||||
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||
|
||||
/**
|
||||
* TODO: Diese Klasse überarbeiten. Pair genericTypeVar ist nicht implementiert.
|
||||
* @author J�rg B�uerle
|
||||
* @version $Date: 2013/09/22 20:12:53 $
|
||||
*/
|
||||
// ino.end
|
||||
// ino.class.GenericTypeVar.26505.declaration
|
||||
public class GenericTypeVar extends ObjectType
|
||||
// ino.end
|
||||
// ino.class.GenericTypeVar.26505.body
|
||||
{
|
||||
//Type genericTypeVar;
|
||||
//Menge<Type> extendVars = new Menge<Type>();
|
||||
@ -236,7 +236,14 @@ public class GenericTypeVar extends ObjectType
|
||||
// TODO Bytecode
|
||||
return org.apache.bcel.generic.Type.getType(getSignatureType(null));// new org.apache.bcel.generic.ObjectType("Object");
|
||||
}
|
||||
|
||||
|
||||
public List<ObjectType> getBounds()
|
||||
{
|
||||
//Gibt eine Liste mit "java.lang.Object" zurück, da jede Generic von Object erbt
|
||||
ArrayList<ObjectType> ret = new ArrayList<>();
|
||||
ret.add(ASTFactory.createObjectType());
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
// ino.end
|
||||
|
@ -130,12 +130,13 @@ public class RefType extends ObjectType implements IMatchable
|
||||
//this.parameter = null;
|
||||
}
|
||||
|
||||
public RefType(JavaClassName jName, SyntaxTreeNode parent, int offset) {
|
||||
this(jName.toString(), parent, offset);
|
||||
|
||||
public RefType(JavaClassName name, List<Type> parameter, int offset) {
|
||||
super(name.toString(), null, offset);
|
||||
this.parameter = parameter;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* Wandelt die Parameter des RefTypes in TPHs um, sofern es sich um Generische Variablen handelt.
|
||||
* @return
|
||||
*/
|
||||
@ -579,12 +580,9 @@ public class RefType extends ObjectType implements IMatchable
|
||||
@Override
|
||||
public String getBytecodeSignature(ClassGenerator cg, TypeinferenceResultSet rs) {
|
||||
String combinedType = getCombinedType(cg, rs);
|
||||
if(!combinedType.equals(getName().toString())){
|
||||
getSuperWildcardTypes();
|
||||
Class generatedClass = ASTFactory.createClass(getCombinedType(cg, rs), getGenericClassType(), null, null, new SourceFile());
|
||||
|
||||
cg.addExtraClass(generatedClass.genByteCode(new TypeinferenceResults()).getByteCode());
|
||||
}
|
||||
/*
|
||||
|
||||
*/
|
||||
String ret = new org.apache.bcel.generic.ObjectType(combinedType).getSignature();
|
||||
return ret;
|
||||
}
|
||||
@ -592,32 +590,48 @@ public class RefType extends ObjectType implements IMatchable
|
||||
public String getCombinedType(ClassGenerator cg, TypeinferenceResultSet rs){
|
||||
//Bsp.: Ljava/util/Vector<Ljava/lang/String;>;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
String ret;
|
||||
List<Type> newParams = new ArrayList<>();
|
||||
if(parameter != null && parameter.size() > 0){
|
||||
sb.append(getName().toString().replace(".", "%"));
|
||||
sb.append("%%");
|
||||
for(Type type: parameter){
|
||||
Type newParameter;
|
||||
if(type instanceof RefType){
|
||||
sb.append(((RefType) type).getCombinedType(cg, rs).replace(".", "%"));
|
||||
newParameter = type;
|
||||
}else if(type instanceof TypePlaceholder){
|
||||
newParameter = rs.getTypeOfPlaceholder((TypePlaceholder)type);
|
||||
sb.append(((TypePlaceholder) type).getBytecodeType(cg, rs).toString().replace(".", "%"));
|
||||
}else if(type instanceof WildcardType){
|
||||
//TODO: unresolved!
|
||||
return this.getName().toString();
|
||||
}else{
|
||||
newParameter = type;
|
||||
sb.append(type.getBytecodeType(cg, rs).toString().replace(".", "%"));
|
||||
}
|
||||
|
||||
newParams.add(newParameter);
|
||||
sb.append("%");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
return sb.append(this.getName().toString()).toString();
|
||||
ret = sb.toString();
|
||||
}else{
|
||||
ret = sb.append(this.getName().toString()).toString();
|
||||
}
|
||||
if(!ret.equals(getName().toString())){
|
||||
//getSuperWildcardTypes();
|
||||
RefType superClass = new RefType(this.getName(),newParams,this.getOffset());
|
||||
Class generatedClass = ASTFactory.createInterface(ret, superClass, null, null, new SourceFile());
|
||||
|
||||
cg.addExtraClass(generatedClass.genByteCode(new TypeinferenceResults()).getByteCode());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
public GenericClassType getGenericClassType(){
|
||||
return new GenericClassType(getName().toString(), getParaList(), parent, getOffset());
|
||||
}
|
||||
*/
|
||||
}
|
||||
// ino.end
|
||||
|
||||
|
@ -3,6 +3,7 @@ package de.dhbwstuttgart.syntaxtree.type;
|
||||
// ino.end
|
||||
// ino.module.Type.8677.import
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.dhbwstuttgart.typeinference.Menge;
|
||||
import de.dhbwstuttgart.bytecode.ClassGenerator;
|
||||
@ -328,5 +329,15 @@ public abstract class Type extends SyntaxTreeNode implements IItemWithOffset
|
||||
public String getClassSignature(ClassGenerator cg, TypeinferenceResultSet rs){
|
||||
return this.getBytecodeSignature(cg, rs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wird beim Bytecode gebraucht.
|
||||
* Einige Klassen werden vom Compiler als gegeben angenommen,
|
||||
* obwohl sie sich nicht in der Java Standard Library befinden.
|
||||
* Diese müssen beim generieren von Bytecode als zusätzliche Klassen generiert werden.
|
||||
*
|
||||
* @return - Eine Liste der Klassen, welche bei Verwendung dieses Typs zusätzlich gebraucht werden.
|
||||
*/
|
||||
//public abstract List<de.dhbwstuttgart.syntaxtree.Class> isClassFromJavaX();
|
||||
}
|
||||
// ino.end
|
||||
|
@ -14,6 +14,7 @@ import de.dhbwstuttgart.bytecode.TypePlaceholderType;
|
||||
import de.dhbwstuttgart.core.MyCompiler;
|
||||
import de.dhbwstuttgart.parser.JavaClassName;
|
||||
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
||||
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
|
||||
import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
||||
import de.dhbwstuttgart.typeinference.ResultSet;
|
||||
import de.dhbwstuttgart.typeinference.TypeInsertable;
|
||||
@ -39,8 +40,6 @@ public class TypePlaceholder extends ObjectType
|
||||
// ino.class.TypePlaceholder.26780.body
|
||||
{
|
||||
private static final Logger log = Logger.getLogger(TypePlaceholder.class.getName());
|
||||
// ino.attribute.strNextName.26785.declaration
|
||||
private static String strNextName = "A";
|
||||
// ino.end
|
||||
// ino.attribute.m_TypePlaceholdersRegistry.26788.declaration
|
||||
private static Hashtable<String, TypePlaceholder> m_TypePlaceholdersRegistry = new Hashtable<String, TypePlaceholder>();
|
||||
@ -104,7 +103,7 @@ public class TypePlaceholder extends ObjectType
|
||||
TypePlaceholder typeVar = new TypePlaceholder(name, parent);
|
||||
TypePlaceholder oldTPH = m_TypePlaceholdersRegistry.put(typeVar.getName().toString(), typeVar);
|
||||
if(oldTPH != null){
|
||||
oldTPH.name = new JavaClassName(makeNewName());
|
||||
oldTPH.name = new JavaClassName(NameGenerator.makeNewName());
|
||||
m_TypePlaceholdersRegistry.put(oldTPH.getName().toString(), oldTPH);
|
||||
}
|
||||
return typeVar;
|
||||
@ -120,7 +119,7 @@ public class TypePlaceholder extends ObjectType
|
||||
* @return
|
||||
*/
|
||||
public static TypePlaceholder fresh(SyntaxTreeNode parent){
|
||||
TypePlaceholder ret= new TypePlaceholder(makeNewName(), parent);
|
||||
TypePlaceholder ret= new TypePlaceholder(NameGenerator.makeNewName(), parent);
|
||||
m_TypePlaceholdersRegistry.put(ret.getName().toString(), ret);
|
||||
return ret;
|
||||
}
|
||||
@ -132,98 +131,7 @@ public class TypePlaceholder extends ObjectType
|
||||
return ret;
|
||||
}
|
||||
|
||||
// ino.method.makeNewName.26803.defdescription type=javadoc
|
||||
/**
|
||||
* Berechnet einen neuen, eindeutigen Namen f�r eine neue
|
||||
* <code>TypePlaceholder</code>. <br>Author: J�rg B�uerle
|
||||
* @return Der Name
|
||||
*/
|
||||
// ino.end
|
||||
// ino.method.makeNewName.26803.definition
|
||||
private static String makeNewName()
|
||||
// ino.end
|
||||
// ino.method.makeNewName.26803.body
|
||||
{
|
||||
// otth: Funktion berechnet einen neuen Namen anhand eines alten gespeicherten
|
||||
String strReturn = strNextName;
|
||||
|
||||
// n�chster Name berechnen und in strNextName speichern
|
||||
inc( strNextName.length() - 1 );
|
||||
|
||||
return strReturn;
|
||||
}
|
||||
// ino.end
|
||||
|
||||
// ino.method.inc.26806.defdescription type=javadoc
|
||||
/**
|
||||
* Hilfsfunktion zur Berechnung eines neuen Namens
|
||||
* <br>Author: J�rg B�uerle
|
||||
* @param i
|
||||
*/
|
||||
// ino.end
|
||||
// ino.method.inc.26806.definition
|
||||
private static void inc(int i)
|
||||
// ino.end
|
||||
// ino.method.inc.26806.body
|
||||
{
|
||||
// otth: Hilfsfunktion zur Berechnung eines neuen Namens
|
||||
// otth: Erh�hung des Buchstabens an der Stelle i im String strNextName
|
||||
// otth: Nach �berlauf: rekursiver Aufruf
|
||||
|
||||
// falls i = -1 --> neuer Buchstabe vorne anf�gen
|
||||
if ( i == -1 )
|
||||
{
|
||||
strNextName = "A" + strNextName;
|
||||
return;
|
||||
}
|
||||
|
||||
char cBuchstabe = (char)(strNextName.charAt( i ));
|
||||
cBuchstabe++;
|
||||
if ( cBuchstabe - 65 > 25 )
|
||||
{
|
||||
// aktuelle Stelle: auf A zuruecksetzen
|
||||
manipulate( i, 'A' );
|
||||
|
||||
// vorherige Stelle erh�hen
|
||||
inc( i - 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// aktueller Buchstabe �ndern
|
||||
manipulate( i, cBuchstabe );
|
||||
}
|
||||
|
||||
}
|
||||
// ino.end
|
||||
|
||||
// ino.method.manipulate.26809.defdescription type=javadoc
|
||||
/**
|
||||
* Hilfsfunktion zur Berechnung eines neuen Namens.
|
||||
* <br>Author: J�rg B�uerle
|
||||
* @param nStelle
|
||||
* @param nWert
|
||||
*/
|
||||
// ino.end
|
||||
// ino.method.manipulate.26809.definition
|
||||
private static void manipulate( int nStelle, char nWert )
|
||||
// ino.end
|
||||
// ino.method.manipulate.26809.body
|
||||
{
|
||||
// otth: Hilfsfunktion zur Berechnung eines neuen Namens
|
||||
// otth: Ersetzt im String 'strNextName' an der Position 'nStelle' den Buchstaben durch 'nWert'
|
||||
|
||||
String strTemp = "";
|
||||
for( int i = 0; i < strNextName.length(); i++)
|
||||
{
|
||||
if ( i == nStelle )
|
||||
strTemp = strTemp + nWert;
|
||||
else
|
||||
strTemp = strTemp + strNextName.charAt( i );
|
||||
}
|
||||
strNextName = strTemp;
|
||||
}
|
||||
// ino.end
|
||||
|
||||
// ino.method.equals.26812.defdescription type=javadoc
|
||||
/**
|
||||
* Author: J�rg B�uerle<br/>
|
||||
@ -327,7 +235,7 @@ public class TypePlaceholder extends ObjectType
|
||||
//backdoorvars werden registiert, weil am Ende beim execute
|
||||
//auf den CSubstitution nicht registrierte Variablen zu
|
||||
//Exceptions fuehrt
|
||||
TypePlaceholder typeVar = new TypePlaceholder(makeNewName(), null);
|
||||
TypePlaceholder typeVar = new TypePlaceholder(NameGenerator.makeNewName(), null);
|
||||
m_TypePlaceholdersRegistry.put(typeVar.getName().toString(), typeVar);
|
||||
return typeVar;
|
||||
|
||||
@ -447,6 +355,10 @@ public class TypePlaceholder extends ObjectType
|
||||
|
||||
@Override
|
||||
public String getBytecodeSignature(ClassGenerator cg, TypeinferenceResultSet rs) {
|
||||
if(rs == null){
|
||||
System.out.println("");
|
||||
return null;
|
||||
}
|
||||
Type resolvedType = rs.getTypeOfPlaceholder(this);
|
||||
if(resolvedType instanceof TypePlaceholder){
|
||||
cg.addUsedTPH((TypePlaceholder)resolvedType);
|
||||
@ -463,7 +375,8 @@ public class TypePlaceholder extends ObjectType
|
||||
ret+=":";
|
||||
Menge<TypePlaceholder> possibleTPHs = cg.getUsedTPH();
|
||||
possibleTPHs.remove(this);
|
||||
org.apache.bcel.generic.Type nearestType = cg.getNearestUsedType(this, possibleTPHs);
|
||||
//TODO: hier komplett überarbeiten. Wann wird ein TPH eine generische Variable, das sollte geklärt werden.
|
||||
org.apache.bcel.generic.Type nearestType = null;//cg.getNearestUsedType(this, possibleTPHs);
|
||||
//if(nearestType instanceof TypePlaceholderType){ //Handelt es sich um einen weiteren TPH als nächsten Typ, so ist es ein allgemeiner Typ und wir nehmen Object als Superklasse
|
||||
if(nearestType == null){
|
||||
ret += cg.getInstructionFactory().createObjectType().getSignature();
|
||||
|
@ -18,4 +18,4 @@ public class IdTest extends SourceFileBytecodeTest{
|
||||
Object obj = cls.newInstance();
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
class Identity{
|
||||
op = (x)->x;
|
||||
|
||||
m(){
|
||||
op.apply(1);
|
||||
}
|
||||
}
|
@ -38,21 +38,18 @@ public class SingleClassTester {
|
||||
Menge<ByteCodeResult> bytecode = compiler.generateBytecode(sourceFiles, results);
|
||||
//System.out.println(bytecode);
|
||||
|
||||
for(ByteCodeResult result: bytecode){
|
||||
for(ByteCodeResult result: bytecode){
|
||||
JavaClass javaClass = result.getByteCode().getJavaClass();
|
||||
javaClass.dump(new File(outputDirectory+javaClass.getClassName()+".class"));
|
||||
|
||||
///*
|
||||
for(ClassGenerator cg: result.getByteCode().getExtraClasses().values()){
|
||||
JavaClass jc = cg.getJavaClass();
|
||||
jc.dump(new File(outputDirectory+jc.getClassName()+".class"));
|
||||
}
|
||||
|
||||
//*/
|
||||
Logger.getLogger("SingleClassTester").error(result.getByteCode().getJavaClass().toString(), Section.CODEGEN);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} catch (IOException | yyException e) {
|
||||
Logger.getLogger("SingleClassTester").error(e.toString(), Section.CODEGEN);
|
||||
|
@ -4,6 +4,8 @@ import static org.junit.Assert.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
@ -60,4 +62,13 @@ public abstract class SourceFileBytecodeTest extends TestCase{
|
||||
|
||||
return new URLClassLoader(urls);
|
||||
}
|
||||
|
||||
protected void testMethod(String methodName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
|
||||
Class testClass = getClassToTest();
|
||||
for(Method m : testClass.getMethods()){
|
||||
if(m.getName().equals(methodName)){
|
||||
m.invoke(testClass, new Object[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
8
test/bytecode/lambda/Simple.jav
Normal file
8
test/bytecode/lambda/Simple.jav
Normal file
@ -0,0 +1,8 @@
|
||||
class Simple{
|
||||
|
||||
op = (i)->i;
|
||||
|
||||
public void main(){
|
||||
op.apply(1);
|
||||
}
|
||||
}
|
19
test/bytecode/lambda/SimpleTest.java
Normal file
19
test/bytecode/lambda/SimpleTest.java
Normal file
@ -0,0 +1,19 @@
|
||||
package bytecode.lambda;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import bytecode.SourceFileBytecodeTest;
|
||||
|
||||
public class SimpleTest extends SourceFileBytecodeTest{
|
||||
@Override
|
||||
protected void init() {
|
||||
testName = "Simple";
|
||||
rootDirectory = System.getProperty("user.dir")+"/test/bytecode/lambda/";
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstruct() throws Exception{
|
||||
this.testMethod("main");
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
5
test/bytecode/lambda/Test.java
Normal file
5
test/bytecode/lambda/Test.java
Normal file
@ -0,0 +1,5 @@
|
||||
class Test{
|
||||
public static void main(String[] args){
|
||||
new Simple().main();
|
||||
}
|
||||
}
|
1
test/bytecode/lambda/TestInterface.java
Normal file
1
test/bytecode/lambda/TestInterface.java
Normal file
@ -0,0 +1 @@
|
||||
interface TestInterface extends Fun1<String,Integer>{}
|
@ -1,4 +1,8 @@
|
||||
|
||||
class Id{
|
||||
op = (x)->x;
|
||||
}
|
||||
class Id {
|
||||
op = (x) -> x;
|
||||
|
||||
m(){
|
||||
op.apply(1);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user