From af6537841cae17976888b3f8c487252ac0c3324c Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Tue, 4 Dec 2018 15:01:50 +0100 Subject: [PATCH] modified: src/de/dhbwstuttgart/bytecode/BytecodeGen.java modified: src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java modified: src/de/dhbwstuttgart/bytecode/signature/Signature.java modified: src/de/dhbwstuttgart/bytecode/utilities/KindOfLambda.java modified: src/de/dhbwstuttgart/bytecode/utilities/Simplify.java modified: src/de/dhbwstuttgart/syntaxtree/Constructor.java modified: test/bytecode/MatrixOpTest.java modified: test/bytecode/YTest.java modified: test/bytecode/javFiles/OL.jav --- .../dhbwstuttgart/bytecode/BytecodeGen.java | 24 +++++++++--- .../bytecode/BytecodeGenMethod.java | 38 +++++++++++++++++++ .../bytecode/signature/Signature.java | 7 +++- .../bytecode/utilities/KindOfLambda.java | 6 +-- .../bytecode/utilities/Simplify.java | 3 +- .../dhbwstuttgart/syntaxtree/Constructor.java | 2 +- test/bytecode/MatrixOpTest.java | 4 +- test/bytecode/YTest.java | 10 ++--- test/bytecode/javFiles/OL.jav | 3 +- 9 files changed, 74 insertions(+), 23 deletions(-) diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index 70f6e7e9e..dcf983573 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.syntaxtree.statement.*; @@ -55,6 +56,8 @@ public class BytecodeGen implements ASTVisitor { private SourceFile sf; private String path; + private Optional fieldInitializations; + private int indexOfFirstParam = 0; private String superClass; @@ -119,6 +122,7 @@ public class BytecodeGen implements ASTVisitor { int acc = isInterface?classOrInterface.getModifiers()+Opcodes.ACC_ABSTRACT:classOrInterface.getModifiers()+Opcodes.ACC_SUPER; + fieldInitializations = classOrInterface.getfieldInitializations(); // resultSet = listOfResultSets.get(0); boolean isConsWithNoParamsVisited = false; @@ -156,10 +160,12 @@ public class BytecodeGen implements ASTVisitor { } for(Constructor c : classOrInterface.getConstructors()) { - if(!isConsWithNoParamsVisited) +// if(!isConsWithNoParamsVisited) { c.accept(this); - if(!c.getParameterList().iterator().hasNext()) - isConsWithNoParamsVisited = true; +// } + +// if(!c.getParameterList().iterator().hasNext()) +// isConsWithNoParamsVisited = true; } for(Method m : classOrInterface.getMethods()) { @@ -194,7 +200,7 @@ public class BytecodeGen implements ASTVisitor { field.getParameterList().accept(this); String methParamTypes = field.name+"%%"; - + Iterator itr = field.getParameterList().iterator(); while(itr.hasNext()) { FormalParameter fp = itr.next(); @@ -203,6 +209,7 @@ public class BytecodeGen implements ASTVisitor { } if(methodNameAndParamsT.contains(methParamTypes)) { + System.out.println("ignore - Method: "+field.name +" , paramsType: "+methParamTypes); return; } methodNameAndParamsT.add(methParamTypes); @@ -225,13 +232,18 @@ public class BytecodeGen implements ASTVisitor { Signature signature = new Signature(field, genericsAndBounds,methodParamsAndTypes,resultSet,constraints); sig = signature.toString(); } + if(field.getParameterList().iterator().hasNext()) + System.out.println(field.getParameterList().iterator().next().getType().acceptTV(new TypeToDescriptor())); + NormalConstructor constructor = new NormalConstructor(field,genericsAndBounds,hasGen); desc = constructor.accept(new DescriptorToString(resultSet)); + System.out.println("Constructor: " + field.getName() + " Sig: "+ sig + " Desc: " + desc); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", desc, sig, null); mv.visitCode(); + Block block = fieldInitializations.get().block; BytecodeGenMethod gen = new BytecodeGenMethod(className,superClass,resultSet,field, mv,paramsAndLocals,cw, - genericsAndBoundsMethod,genericsAndBounds,isInterface,classFiles, sf,path); - if(!field.getParameterList().iterator().hasNext()) { + genericsAndBoundsMethod,genericsAndBounds,isInterface,classFiles, sf,path, block); + if(!field.getParameterList().iterator().hasNext() && !(field.block.statements.get(field.block.statements.size()-1) instanceof ReturnVoid)) { mv.visitInsn(Opcodes.RETURN); } mv.visitMaxs(0, 0); diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index 715e47f27..1e1048ff6 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -75,6 +75,8 @@ public class BytecodeGenMethod implements StatementVisitor { private boolean needDUP = false; + private Block blockFieldInit = null; + private boolean isBlockFieldInitVisited = false; // for tests ** private String fieldName; private String fieldDesc; @@ -85,7 +87,32 @@ public class BytecodeGenMethod implements StatementVisitor { private HashMap classFiles; private ArrayList varsFunInterface = new ArrayList<>();; + // generate bytecode for constructor + public BytecodeGenMethod(String className, String superClass,ResultSet resultSet, Method m, MethodVisitor mv, + HashMap paramsAndLocals, ClassWriter cw, HashMap genericsAndBoundsMethod, + HashMap genericsAndBounds, boolean isInterface, HashMap classFiles, + SourceFile sf,String path, Block block) { + this.className = className; + this.superClass = superClass; + this.resultSet = resultSet; + this.m = m; + this.mv = mv; + this.paramsAndLocals = paramsAndLocals; + this.cw = cw; + this.genericsAndBoundsMethod = genericsAndBoundsMethod; + this.genericsAndBounds = genericsAndBounds; + this.isInterface = isInterface; + this.classFiles = classFiles; + this.sf = sf; + this.path = path; + if(block != null) + this.blockFieldInit = block; + this.m.block.accept(this); + + + } + public BytecodeGenMethod(String className, String superClass,ResultSet resultSet, Method m, MethodVisitor mv, HashMap paramsAndLocals, ClassWriter cw, HashMap genericsAndBoundsMethod, HashMap genericsAndBounds, boolean isInterface, HashMap classFiles, SourceFile sf,String path) { @@ -161,6 +188,17 @@ public class BytecodeGenMethod implements StatementVisitor { superCall.arglist.accept(this); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, this.superClass, superCall.name, "()V", isInterface); + + if(blockFieldInit!=null && !isBlockFieldInitVisited) { + isBlockFieldInitVisited =true; + //blockFieldInit.accept(this); + for(Statement stmt : blockFieldInit.statements) { + if(stmt instanceof SuperCall) + continue; + + stmt.accept(this); + } + } } // ?? diff --git a/src/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java index 8626cbf9f..74454d3fc 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -19,6 +19,7 @@ import de.dhbwstuttgart.syntaxtree.Constructor; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression; +import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; @@ -331,15 +332,17 @@ public class Signature { case "EWC": System.out.println("EWC---Signature"); - SuperWildcardType ewc = (SuperWildcardType) t; + ExtendsWildcardType ewc = (ExtendsWildcardType) t; String esigInner = ewc.getInnerType().acceptTV(new TypeToSignature()); + System.out.println(esigInner); if(ewc.getInnerType() instanceof TypePlaceholder) { sv.visitTypeArgument('+').visitTypeVariable(esigInner.substring(1, esigInner.length())); } else if(ewc.getInnerType() instanceof RefType) { if(esigInner.contains("$$")) { sv.visitTypeArgument('+').visitInterface().visitClassType(esigInner.substring(1,esigInner.length())); }else { - sv.visitTypeArgument('+').visitClassType(esigInner.substring(1,esigInner.length())); + sv.visitClassType(esigInner.substring(1,esigInner.length())); +// sv.visitTypeArgument('+').visitClassType(esigInner.substring(1,esigInner.length())); } }else { sv.visitTypeArgument('+').visitTypeVariable(esigInner.substring(1)); diff --git a/src/de/dhbwstuttgart/bytecode/utilities/KindOfLambda.java b/src/de/dhbwstuttgart/bytecode/utilities/KindOfLambda.java index 2e5c81db6..b897684ab 100644 --- a/src/de/dhbwstuttgart/bytecode/utilities/KindOfLambda.java +++ b/src/de/dhbwstuttgart/bytecode/utilities/KindOfLambda.java @@ -20,6 +20,7 @@ public class KindOfLambda implements StatementVisitor{ private List argumentList = new ArrayList<>(); private ArrayList usedVars = new ArrayList<>(); private boolean hasThis = false; + private ArrayList definedLocals = new ArrayList<>(); public KindOfLambda(LambdaExpression lambdaExpression) { this.params = lambdaExpression.params; @@ -110,7 +111,7 @@ public class KindOfLambda implements StatementVisitor{ @Override public void visit(LocalVar localVar) { - if(!contain(params, localVar.name)) { + if(!contain(params, localVar.name) && !definedLocals.contains(localVar.name)) { argumentList.add(localVar.getType()); if(hasThis) { usedVars.add(1, localVar.name); @@ -134,8 +135,7 @@ public class KindOfLambda implements StatementVisitor{ @Override public void visit(LocalVarDecl localVarDecl) { - // TODO Auto-generated method stub - + definedLocals.add(localVarDecl.getName()); } @Override diff --git a/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java b/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java index c96d21e16..2ec212f7e 100644 --- a/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java +++ b/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java @@ -136,9 +136,8 @@ public class Simplify { // put the generated constraint and its equal set into result set result.put(constraint, eq); constraints.clear(); - allTypes.clear(); } - + allTypes.clear(); } } // build an equal set that contains all types diff --git a/src/de/dhbwstuttgart/syntaxtree/Constructor.java b/src/de/dhbwstuttgart/syntaxtree/Constructor.java index 059211d19..8be687f8e 100644 --- a/src/de/dhbwstuttgart/syntaxtree/Constructor.java +++ b/src/de/dhbwstuttgart/syntaxtree/Constructor.java @@ -16,7 +16,7 @@ public class Constructor extends Method { //TODO: Constructor braucht ein super-Statement public Constructor(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, ParameterList parameterList, Block codeInsideConstructor, GenericDeclarationList gtvDeclarations, Token offset /*, List fieldInitializations geloescht PL 2018-11-24 */) { - super(modifier, name, returnType, parameterList, codeInsideConstructor /* prepareBlock(codeInsideConstructor ,fieldInitializations geloescht PL 2018-11-24 )*/, gtvDeclarations, offset); + super(modifier, name, returnType, parameterList, /*codeInsideConstructor,*/ prepareBlock(codeInsideConstructor ) /*,fieldInitializations )geloescht PL 2018-11-24 )*/, gtvDeclarations, offset); } diff --git a/test/bytecode/MatrixOpTest.java b/test/bytecode/MatrixOpTest.java index 5372f4579..178aa43e5 100644 --- a/test/bytecode/MatrixOpTest.java +++ b/test/bytecode/MatrixOpTest.java @@ -33,8 +33,8 @@ public class MatrixOpTest { compiler = new JavaTXCompiler(fileToTest); pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/"; compiler.generateBytecode(pathToClassFile); -// loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); -// classToTest = loader.loadClass("MatrixOP"); + loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); + classToTest = loader.loadClass("MatrixOP"); /* Vector> vv = new Vector>(); Vector v1 = new Vector (); diff --git a/test/bytecode/YTest.java b/test/bytecode/YTest.java index 80d37c6ad..1c4f13a64 100644 --- a/test/bytecode/YTest.java +++ b/test/bytecode/YTest.java @@ -25,11 +25,11 @@ public class YTest { public void generateBC() throws Exception { path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Y.jav"; fileToTest = new File(path); - compiler = new JavaTXCompiler(fileToTest); - compiler.generateBytecode(System.getProperty("user.dir")+"/testBytecode/generatedBC/"); - pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/"; - loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); - classToTest = loader.loadClass("Y"); +// compiler = new JavaTXCompiler(fileToTest); +// compiler.generateBytecode(System.getProperty("user.dir")+"/testBytecode/generatedBC/"); +// pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/"; +// loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); +// classToTest = loader.loadClass("Y"); /* instanceOfClass = classToTest.getDeclaredConstructor().newInstance(); diff --git a/test/bytecode/javFiles/OL.jav b/test/bytecode/javFiles/OL.jav index 68650428e..700e50f0a 100644 --- a/test/bytecode/javFiles/OL.jav +++ b/test/bytecode/javFiles/OL.jav @@ -9,7 +9,7 @@ public class OL { m(x) { return x + x; } } - + public class OLMain { @@ -20,4 +20,3 @@ public class OLMain { return ol.m(x); } } -