diff --git a/src/mycompiler/MyCompiler.java b/src/mycompiler/MyCompiler.java index a40d0554..957a26dc 100755 --- a/src/mycompiler/MyCompiler.java +++ b/src/mycompiler/MyCompiler.java @@ -13,6 +13,7 @@ import java.io.Reader; import java.io.StringReader; import java.util.Vector; +import mycompiler.mybytecode.ClassFile; import mycompiler.myclass.Class; import mycompiler.myclass.ClassBody; import mycompiler.myclass.Constructor_Backup; @@ -42,6 +43,7 @@ import org.apache.log4j.xml.DOMConfigurator; import com.sun.corba.se.spi.orbutil.fsm.Guard.Result; import com.sun.org.apache.xerces.internal.impl.xs.identity.Field; +import typinferenz.ResultSet; import typinferenz.TypinferenzException; // ino.end import typinferenz.assumptions.TypeAssumptions; @@ -534,30 +536,30 @@ public class MyCompiler implements MyCompilerAPI - // ino.method.codeGeneration.21310.defdescription type=javadoc /** * Author: J�rg B�uerle
* Generiert den Bytecode und das Class-File f�r den Syntaxbaum. * @throws NullPointerException Wenn noch kein abstrakter Syntaxbaum vorhanden * ist. */ - // ino.end - // ino.method.codeGeneration.21310.definition - public void codeGeneration() + @Override + public Vector codeGeneration(ResultSet result) throws NullPointerException, JVMCodeException - // ino.end - // ino.method.codeGeneration.21310.body { if(m_AbstractSyntaxTree==null){ throw new NullPointerException("Es wurde noch kein Abstrakter Syntaxbaum erstellt!"); } codegenlog.info("Beginn der Codegenerierung ..."); - //m_AbstractSyntaxTree.codegen(); + Vector ret = new Vector(); + + for(SourceFile sf : m_AbstractSyntaxTree){ + ret.addAll(sf.codegen(result)); + } codegenlog.info("Codegenerierung beendet!"); + return ret; } - // ino.end // ino.method.main.21313.defdescription type=javadoc /** diff --git a/src/mycompiler/MyCompilerAPI.java b/src/mycompiler/MyCompilerAPI.java index 9120cb74..a0d3349e 100755 --- a/src/mycompiler/MyCompilerAPI.java +++ b/src/mycompiler/MyCompilerAPI.java @@ -7,6 +7,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Vector; + +import typinferenz.ResultSet; +import mycompiler.mybytecode.ClassFile; import mycompiler.myexception.CTypeReconstructionException; import mycompiler.myexception.JVMCodeException; import mycompiler.myparser.JavaParser; @@ -94,7 +97,7 @@ public interface MyCompilerAPI */ // ino.end // ino.method.codeGeneration.21346.declaration - public void codeGeneration() + public Vector codeGeneration(ResultSet result) throws NullPointerException, JVMCodeException; // ino.end diff --git a/src/mycompiler/SourceFile.java b/src/mycompiler/SourceFile.java index 4dd5c1d5..46c353e0 100755 --- a/src/mycompiler/SourceFile.java +++ b/src/mycompiler/SourceFile.java @@ -3,11 +3,13 @@ package mycompiler; // ino.end // ino.module.SourceFile.8722.import +import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; +import mycompiler.mybytecode.ClassFile; import mycompiler.myclass.BasicAssumptionClass; import mycompiler.myclass.Class; import mycompiler.myclass.ImportDeclarations; @@ -216,11 +218,12 @@ public class SourceFile */ // ino.end // ino.method.codegen.21397.definition - public void codegen() + public Vector codegen(ResultSet result) throws JVMCodeException // ino.end // ino.method.codegen.21397.body { + Vector ret = new Vector(); codegenlog.info("Anzahl der Interfaces: " + Integer.toString(InterfaceVektor.size())); for(int i = 0; i < InterfaceVektor.size(); i++) { @@ -230,8 +233,9 @@ public class SourceFile codegenlog.info("Anzahl der Klassen: " + Integer.toString(KlassenVektor.size())); for(int i = 0; i < KlassenVektor.size(); i++) { - KlassenVektor.elementAt(i).codegen(this); + ret.add(KlassenVektor.elementAt(i).codegen(result)); } + return ret; } // ino.end @@ -1539,5 +1543,6 @@ public class SourceFile //this.filename = filename; } + } // ino.end diff --git a/src/mycompiler/myclass/Class.java b/src/mycompiler/myclass/Class.java index 35f9dbfe..7dacfbe1 100755 --- a/src/mycompiler/myclass/Class.java +++ b/src/mycompiler/myclass/Class.java @@ -299,8 +299,14 @@ public class Class extends SyntaxTreeNode implements AClassOrInterface + /** + * Generiert die ClassFile für diese Klasse. + * @param typeinferenceResult - Das ResultSet einer Typinferierung oder null, falls alle Typen eindeutig feststehen. + * @return + * @throws JVMCodeException + */ // ino.method.codegen.23071.definition - public void codegen(SourceFile sf) + public ClassFile codegen(ResultSet typeinferenceResult) throws JVMCodeException // ino.end // ino.method.codegen.23071.body @@ -316,12 +322,13 @@ public class Class extends SyntaxTreeNode implements AClassOrInterface } // Handling der Package - String pkgName = ""; - if (sf.getPackageName() != null) { - pkgName = sf.getPackageName().get_codegen_UsedId() + "/"; - } + //String pkgName = ""; + //if (sf.getPackageName() != null) { + // pkgName = sf.getPackageName().get_codegen_UsedId() + "/"; + //} - classfile.add_class(getName(), pkgName, superClass, getAccessFlags()); + //geändert von Andreas Stadelmeier: pkgName wird nicht mehr aus dem SourceFile ausgelesen: + classfile.add_class(getName(), pkgName.get_Name_1Element(), superClass, getAccessFlags()); // Handling fuer Superinterfaces classfile.addSuperInterfaces(getSuperInterfaces()); @@ -340,9 +347,10 @@ public class Class extends SyntaxTreeNode implements AClassOrInterface classfile.add_method("", "()V", null, null, null, (short)0, this.paralist, false); } - classfile.codegen(); + //classfile.codegen(); codegenlog.info("Compilierung erfolgreich abgeschlossen, "+ getName() + ".class erstellt."); + return classfile; } public void codegen(ClassFile classfile, Vector paralist) diff --git a/src/mycompiler/mytypereconstruction/TypeinferenceResultSet.java b/src/mycompiler/mytypereconstruction/TypeinferenceResultSet.java index 933e8985..60d59836 100755 --- a/src/mycompiler/mytypereconstruction/TypeinferenceResultSet.java +++ b/src/mycompiler/mytypereconstruction/TypeinferenceResultSet.java @@ -121,5 +121,13 @@ public class TypeinferenceResultSet return ret; } + /** + * Startet die Bytecodegenerierung dieser Lösung. + * Dabei wird die codegen-Methode der inferierten Klasse mit diesem ResultSet aufgerufen. + */ + public void codegen(){ + + } + } // ino.end diff --git a/test/bytecode/EmptyClassTest.java b/test/bytecode/EmptyClassTest.java new file mode 100644 index 00000000..db89b73a --- /dev/null +++ b/test/bytecode/EmptyClassTest.java @@ -0,0 +1,28 @@ +package bytecode; + +import java.util.Vector; + +import junit.framework.TestCase; +import mycompiler.MyCompiler; +import mycompiler.MyCompilerAPI; +import mycompiler.myexception.JVMCodeException; +import mycompiler.mytypereconstruction.TypeinferenceResultSet; + +import org.junit.Test; + +public class EmptyClassTest extends TestCase { + + @Test + public void test(){ + MyCompilerAPI compiler = MyCompiler.getAPI(); + compiler.parse("class EmptyClass{}"); + try { + compiler.codeGeneration(null); + } catch (NullPointerException | JVMCodeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + assertTrue("Test erfolgreich",true); + } + +}