From 2b62ac43e64634f195860f4b70c59809d764f817 Mon Sep 17 00:00:00 2001 From: "Fikus, Evelyn (WWI2012D)" Date: Thu, 21 May 2015 17:10:04 +0200 Subject: [PATCH 1/3] =?UTF-8?q?21.05.15=20-=20Konferenz=20Call;=20Class.ja?= =?UTF-8?q?va=20GenByteCode=20Methode=20-=20Zusatz:=20R=C3=BCckgabewert=20?= =?UTF-8?q?sollte=20ByteCode=20sein;=20Entsprechend=20muss=20=C3=A4hnlich?= =?UTF-8?q?=20JavaCodeResult=20Klasse=20eine=20ByteCodeResult=20Klasse=20e?= =?UTF-8?q?rstellt=20werden...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 21 +++--- .settings/org.eclipse.jdt.core.prefs | 26 +++---- bin/log4j.xml | 70 +++++++++---------- bin/log4jTesting.xml | 48 ++++++------- src/de/dhbwstuttgart/syntaxtree/Class.java | 17 ++++- .../dhbwstuttgart/syntaxtree/ClassBody.java | 3 +- 6 files changed, 100 insertions(+), 85 deletions(-) diff --git a/.classpath b/.classpath index 45b378ef..17feec47 100755 --- a/.classpath +++ b/.classpath @@ -1,10 +1,11 @@ - - - - - - - - - - + + + + + + + + + + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 2e8ab188..f307ce3c 100755 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,13 +1,13 @@ -eclipse.preferences.version=1 -instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 +eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/bin/log4j.xml b/bin/log4j.xml index 64e7c5db..f36fb342 100755 --- a/bin/log4j.xml +++ b/bin/log4j.xml @@ -1,35 +1,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/log4jTesting.xml b/bin/log4jTesting.xml index dc30c245..ef849218 100755 --- a/bin/log4jTesting.xml +++ b/bin/log4jTesting.xml @@ -1,24 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/de/dhbwstuttgart/syntaxtree/Class.java b/src/de/dhbwstuttgart/syntaxtree/Class.java index 09d44797..2858dc9b 100755 --- a/src/de/dhbwstuttgart/syntaxtree/Class.java +++ b/src/de/dhbwstuttgart/syntaxtree/Class.java @@ -7,6 +7,9 @@ import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; + +import org.apache.bcel.generic.ClassGen; + import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.logger.Logger; @@ -33,7 +36,10 @@ import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint; import de.dhbwstuttgart.typeinference.unify.FC_TTO; import de.dhbwstuttgart.typeinference.unify.Unify; - +import org.apache.bcel.generic.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.*; +import java.io.*; // ino.class.Class.23010.declaration public class Class extends GTVDeclarationContext implements AClassOrInterface, IItemWithOffset, Generic, GenericTypeInsertable @@ -49,6 +55,15 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I protected UsedId pkgName; protected Modifiers modifiers; protected String name; + /* private ClassGen _cg; + + public ClassGen genByteCode() { + ByteCodeResult bc = new ByteCodeResult(); + _cg = new ClassGen(pkgName.get_Name() + "/" + name, superClass.get_Name(), name + ".java", Constants.ACC_PUBLIC , new String[] { }); + //_cg zurückgeben + bc.append(BCELByteCodeOutput); + return _cg; + }*/ private Menge superif = new Menge(); diff --git a/src/de/dhbwstuttgart/syntaxtree/ClassBody.java b/src/de/dhbwstuttgart/syntaxtree/ClassBody.java index cbac8f9f..1c96052f 100755 --- a/src/de/dhbwstuttgart/syntaxtree/ClassBody.java +++ b/src/de/dhbwstuttgart/syntaxtree/ClassBody.java @@ -345,8 +345,7 @@ public void istParameterOK( Menge Parameter, Menge KlassenVektor ) return ret.attach("}\n"); } - - + } From 57350e2095d94d6067e2ac02841497260f6c411b Mon Sep 17 00:00:00 2001 From: "Fikus, Evelyn (WWI2012D)" Date: Fri, 22 May 2015 13:50:43 +0200 Subject: [PATCH 2/3] Fertige class.java ByteCode Generierung --- .classpath | 2 +- .settings/org.eclipse.jdt.core.prefs | 6 +- src/de/dhbwstuttgart/syntaxtree/Class.java | 44 +++++++++++-- .../typeinference/ByteCodeResult.java | 64 +++++++++++++++++++ 4 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 src/de/dhbwstuttgart/typeinference/ByteCodeResult.java diff --git a/.classpath b/.classpath index 17feec47..a88ba6e0 100755 --- a/.classpath +++ b/.classpath @@ -3,7 +3,7 @@ - + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index f307ce3c..37e3515b 100755 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -2,12 +2,12 @@ eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/src/de/dhbwstuttgart/syntaxtree/Class.java b/src/de/dhbwstuttgart/syntaxtree/Class.java index 2858dc9b..155337f9 100755 --- a/src/de/dhbwstuttgart/syntaxtree/Class.java +++ b/src/de/dhbwstuttgart/syntaxtree/Class.java @@ -9,6 +9,11 @@ import java.util.Hashtable; import java.util.Iterator; import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; import de.dhbwstuttgart.typeinference.Menge; @@ -41,6 +46,8 @@ import org.apache.bcel.classfile.*; import org.apache.bcel.*; import java.io.*; + + // ino.class.Class.23010.declaration public class Class extends GTVDeclarationContext implements AClassOrInterface, IItemWithOffset, Generic, GenericTypeInsertable // ino.end @@ -55,15 +62,42 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I protected UsedId pkgName; protected Modifiers modifiers; protected String name; - /* private ClassGen _cg; + //For ByteCode Construction + private InstructionFactory _factory; + private ConstantPoolGen _cp; + private ClassGen _cg; - public ClassGen genByteCode() { - ByteCodeResult bc = new ByteCodeResult(); + //Method created with BCEL to generate ByteCode + public ByteCodeResult genByteCode() throws IOException { + + ByteCodeResult code = new ByteCodeResult(); + + _cg = new ClassGen(pkgName.get_Name() + "/" + name, superClass.get_Name(), name + ".java", Constants.ACC_PUBLIC , new String[] { }); //new String necessary? + _cp = _cg.getConstantPool(); + _factory = new InstructionFactory(_cg, _cp); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, new String[] { }, "", "bceltesting.leer", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createLoad(org.apache.bcel.generic.Type.OBJECT, 0)); //creates Constructor + il.append(_factory.createInvoke("java.lang.Object", "", org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, Constants.INVOKESPECIAL)); + InstructionHandle ih_4 = il.append(_factory.createReturn(org.apache.bcel.generic.Type.VOID)); //creates Constructor + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + _cg.getJavaClass().dump(out); + code.attach(out.toString()); + + return code; + + /*ByteCodeResult bc = new ByteCodeResult(); _cg = new ClassGen(pkgName.get_Name() + "/" + name, superClass.get_Name(), name + ".java", Constants.ACC_PUBLIC , new String[] { }); //_cg zurückgeben bc.append(BCELByteCodeOutput); - return _cg; - }*/ + return _cg;*/ + } private Menge superif = new Menge(); diff --git a/src/de/dhbwstuttgart/typeinference/ByteCodeResult.java b/src/de/dhbwstuttgart/typeinference/ByteCodeResult.java new file mode 100644 index 00000000..e0f2b382 --- /dev/null +++ b/src/de/dhbwstuttgart/typeinference/ByteCodeResult.java @@ -0,0 +1,64 @@ +package de.dhbwstuttgart.typeinference; + +import de.dhbwstuttgart.typeinference.Menge; + +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; + +public class ByteCodeResult{ + + private String byteCode = ""; + //TODO: unresolvedTPHs entfernen. BROKEN! + private Menge unresolvedTPHs = new Menge(); + + public ByteCodeResult(){ + + } + + public ByteCodeResult(String byteCode){ + this.byteCode += byteCode; + } + + public String getByteCode(){ + return byteCode; + } + + public ByteCodeResult attach(ByteCodeResult byteCodeResult){ + this.byteCode += byteCodeResult.getByteCode(); + //Alle TPH anfügen: + for(TypePlaceholder tph : byteCodeResult.getUnresolvedTPH())this.addUnresolvedTPH(tph); + return this; + } + + public ByteCodeResult attach(String javaCode){ + this.byteCode += javaCode; + return this; + } + + public void addUnresolvedTPH(TypePlaceholder typePlaceholder) { + unresolvedTPHs.add(typePlaceholder); + } + + /** + * Liefert alle TPHs, welche in diesem ByteCodeResult nicht zu einem Typ aufgelöst wurden. + * Diese TPHs stehen dadurch im ByteCode als Variablennamen ohne zugeordnetem Typ. + * @return + */ + public Menge getUnresolvedTPH(){ + return unresolvedTPHs; + } + + @Override + public String toString(){ + return getByteCode(); + } + + @Override + public boolean equals(Object obj){ + if(!(obj instanceof ByteCodeResult))return false; + ByteCodeResult equals = (ByteCodeResult)obj; + if(!equals.getByteCode().equals(this.getByteCode()))return false; + if(!equals.getUnresolvedTPH().equals(this.getUnresolvedTPH()))return false; + return true; + } + +} From a94d7326b14bc4c1d01bbde0204bda945993d666 Mon Sep 17 00:00:00 2001 From: "Fikus, Evelyn (WWI2012D)" Date: Fri, 22 May 2015 13:54:46 +0200 Subject: [PATCH 3/3] Kleiner Formfehler korrigiert --- src/de/dhbwstuttgart/syntaxtree/Class.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/syntaxtree/Class.java b/src/de/dhbwstuttgart/syntaxtree/Class.java index 155337f9..5acd3c00 100755 --- a/src/de/dhbwstuttgart/syntaxtree/Class.java +++ b/src/de/dhbwstuttgart/syntaxtree/Class.java @@ -78,7 +78,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I ByteArrayOutputStream out = new ByteArrayOutputStream(); InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, new String[] { }, "", "bceltesting.leer", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, new String[] { }, "", pkgName.get_Name() + "." + name, il, _cp); InstructionHandle ih_0 = il.append(_factory.createLoad(org.apache.bcel.generic.Type.OBJECT, 0)); //creates Constructor il.append(_factory.createInvoke("java.lang.Object", "", org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, Constants.INVOKESPECIAL));