forked from JavaTX/JavaCompilerCore
genByteCode für Constructor implementiert. Unfertig
This commit is contained in:
parent
6030682400
commit
f3a324fb38
@ -864,7 +864,9 @@ public class MyCompiler implements MyCompilerAPI
|
|||||||
* - wird der Rückgabetyp von generateBytecode in MyCompiler geändert, so muss auch der Rückgabetyp im Interface MyCompilerAPI geändert werden
|
* - wird der Rückgabetyp von generateBytecode in MyCompiler geändert, so muss auch der Rückgabetyp im Interface MyCompilerAPI geändert werden
|
||||||
*/
|
*/
|
||||||
try {
|
try {
|
||||||
return this.m_AbstractSyntaxTree.firstElement().KlassenVektor.firstElement().genByteCode();
|
SourceFile parsedFile = this.m_AbstractSyntaxTree.firstElement();
|
||||||
|
Class parsedClass = parsedFile.KlassenVektor.firstElement();
|
||||||
|
return parsedClass.genByteCode();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
|
@ -16,9 +16,9 @@ import org.apache.bcel.generic.InstructionList;
|
|||||||
import org.apache.bcel.generic.MethodGen;
|
import org.apache.bcel.generic.MethodGen;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
|
|
||||||
import de.dhbwstuttgart.logger.Logger;
|
import de.dhbwstuttgart.logger.Logger;
|
||||||
import de.dhbwstuttgart.logger.Section;
|
import de.dhbwstuttgart.logger.Section;
|
||||||
|
import de.dhbwstuttgart.logger.SectionLogger;
|
||||||
import de.dhbwstuttgart.core.AClassOrInterface;
|
import de.dhbwstuttgart.core.AClassOrInterface;
|
||||||
import de.dhbwstuttgart.core.IItemWithOffset;
|
import de.dhbwstuttgart.core.IItemWithOffset;
|
||||||
import de.dhbwstuttgart.parser.JavaClassName;
|
import de.dhbwstuttgart.parser.JavaClassName;
|
||||||
@ -37,13 +37,16 @@ import de.dhbwstuttgart.typeinference.*;
|
|||||||
import de.dhbwstuttgart.typeinference.assumptions.ClassAssumption;
|
import de.dhbwstuttgart.typeinference.assumptions.ClassAssumption;
|
||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
|
||||||
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
|
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
|
||||||
|
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
|
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
|
||||||
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint;
|
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint;
|
||||||
import de.dhbwstuttgart.typeinference.unify.FC_TTO;
|
import de.dhbwstuttgart.typeinference.unify.FC_TTO;
|
||||||
import de.dhbwstuttgart.typeinference.unify.Unify;
|
import de.dhbwstuttgart.typeinference.unify.Unify;
|
||||||
|
|
||||||
import org.apache.bcel.generic.*;
|
import org.apache.bcel.generic.*;
|
||||||
import org.apache.bcel.classfile.*;
|
import org.apache.bcel.classfile.*;
|
||||||
import org.apache.bcel.*;
|
import org.apache.bcel.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
|
|
||||||
@ -70,26 +73,21 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
|||||||
//Method created with BCEL to generate ByteCode
|
//Method created with BCEL to generate ByteCode
|
||||||
public ByteCodeResult genByteCode() throws IOException {
|
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?
|
|
||||||
|
SectionLogger logger = Logger.getSectionLogger(this.getClass().getName(), Section.CODEGEN);
|
||||||
|
logger.debug("Test");
|
||||||
|
|
||||||
|
if(pkgName != null)throw new NotImplementedException();
|
||||||
|
_cg = new ClassGen(name, superClass.get_Name(), name + ".java", Constants.ACC_PUBLIC , new String[] { }); //new String necessary?
|
||||||
_cp = _cg.getConstantPool();
|
_cp = _cg.getConstantPool();
|
||||||
_factory = new InstructionFactory(_cg, _cp);
|
_factory = new InstructionFactory(_cg, _cp);
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
||||||
|
|
||||||
InstructionList il = new InstructionList();
|
for(Field field : this.fielddecl){
|
||||||
MethodGen method = new MethodGen(Constants.ACC_PUBLIC, org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, new String[] { }, "<init>", pkgName.get_Name() + "." + name, il, _cp);
|
field.genByteCode(_cg);
|
||||||
|
}
|
||||||
InstructionHandle ih_0 = il.append(_factory.createLoad(org.apache.bcel.generic.Type.OBJECT, 0)); //creates Constructor
|
|
||||||
il.append(_factory.createInvoke("java.lang.Object", "<init>", 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());
|
|
||||||
|
|
||||||
|
ByteCodeResult code = new ByteCodeResult(_cg);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
/*ByteCodeResult bc = new ByteCodeResult();
|
/*ByteCodeResult bc = new ByteCodeResult();
|
||||||
|
@ -1,7 +1,15 @@
|
|||||||
package de.dhbwstuttgart.syntaxtree;
|
package de.dhbwstuttgart.syntaxtree;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import org.apache.bcel.Constants;
|
||||||
|
import org.apache.bcel.classfile.ConstantPool;
|
||||||
|
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;
|
||||||
import de.dhbwstuttgart.myexception.JVMCodeException;
|
import de.dhbwstuttgart.myexception.JVMCodeException;
|
||||||
import de.dhbwstuttgart.parser.JavaClassName;
|
import de.dhbwstuttgart.parser.JavaClassName;
|
||||||
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
||||||
@ -42,6 +50,26 @@ public class Constructor extends Method {
|
|||||||
ret.addAssumption(new ConstructorAssumption(this, parentClass));
|
ret.addAssumption(new ConstructorAssumption(this, parentClass));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void genByteCode(ClassGen cg) {
|
||||||
|
ConstantPoolGen _cp = cg.getConstantPool();
|
||||||
|
InstructionFactory _factory = new InstructionFactory(cg, _cp);
|
||||||
|
InstructionList il = new InstructionList();
|
||||||
|
Class parentClass = this.getParentClass();
|
||||||
|
//TODO: Hier return type und Argument-Typen dynamisch generieren. return type mittels method.getReturnType() ermitteln
|
||||||
|
MethodGen method = new MethodGen(Constants.ACC_PUBLIC, org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, new String[] { }, "<init>", parentClass.name, il, _cp);
|
||||||
|
|
||||||
|
InstructionHandle ih_0 = il.append(_factory.createLoad(org.apache.bcel.generic.Type.OBJECT, 0)); //creates Constructor
|
||||||
|
il.append(_factory.createInvoke(this.getParentClass().superclassid.toString(), "<init>", 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@Override
|
@Override
|
||||||
public void parserPostProcessing(SyntaxTreeNode parent){
|
public void parserPostProcessing(SyntaxTreeNode parent){
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package de.dhbwstuttgart.syntaxtree;
|
package de.dhbwstuttgart.syntaxtree;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import org.apache.bcel.generic.ClassGen;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
import de.dhbwstuttgart.myexception.JVMCodeException;
|
import de.dhbwstuttgart.myexception.JVMCodeException;
|
||||||
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
|
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
|
||||||
@ -171,4 +172,10 @@ public abstract class Field extends GTVDeclarationContext implements TypeInserta
|
|||||||
public boolean isClass() {
|
public boolean isClass() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fügt das das Feld zu ClassGen hinzu
|
||||||
|
* @param cg
|
||||||
|
*/
|
||||||
|
public abstract void genByteCode(ClassGen cg);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package de.dhbwstuttgart.syntaxtree;
|
package de.dhbwstuttgart.syntaxtree;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import org.apache.bcel.generic.ClassGen;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
import de.dhbwstuttgart.myexception.JVMCodeException;
|
import de.dhbwstuttgart.myexception.JVMCodeException;
|
||||||
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Expr;
|
import de.dhbwstuttgart.syntaxtree.statement.Expr;
|
||||||
@ -157,4 +158,10 @@ public class FieldDeclaration extends Field{
|
|||||||
if(this.getWert()!=null)this.getWert().wandleRefTypeAttributes2GenericAttributes(paralist, new Menge<GenericTypeVar>()); //FieldDeclaration hat keine Generischen Variablen, daher leere Liste übergeben
|
if(this.getWert()!=null)this.getWert().wandleRefTypeAttributes2GenericAttributes(paralist, new Menge<GenericTypeVar>()); //FieldDeclaration hat keine Generischen Variablen, daher leere Liste übergeben
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void genByteCode(ClassGen cg) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,11 @@ package de.dhbwstuttgart.syntaxtree;
|
|||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.bcel.generic.ClassGen;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
|
|
||||||
import de.dhbwstuttgart.logger.Logger;
|
import de.dhbwstuttgart.logger.Logger;
|
||||||
|
|
||||||
import de.dhbwstuttgart.core.IItemWithOffset;
|
import de.dhbwstuttgart.core.IItemWithOffset;
|
||||||
import de.dhbwstuttgart.core.MyCompiler;
|
import de.dhbwstuttgart.core.MyCompiler;
|
||||||
import de.dhbwstuttgart.myexception.JVMCodeException;
|
import de.dhbwstuttgart.myexception.JVMCodeException;
|
||||||
@ -711,6 +712,13 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
|
|||||||
return super.equals(obj);
|
return super.equals(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void genByteCode(ClassGen cg) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
// ino.end
|
// ino.end
|
||||||
|
@ -48,7 +48,6 @@ public class MethodCall extends Expr
|
|||||||
}
|
}
|
||||||
// ino.end
|
// ino.end
|
||||||
|
|
||||||
|
|
||||||
// ino.attribute.receiver.25639.declaration
|
// ino.attribute.receiver.25639.declaration
|
||||||
/**
|
/**
|
||||||
* Diese Variable speichert die Expression, welche die Klasse von welcher die Methode aufgerufen wird darstellt.
|
* Diese Variable speichert die Expression, welche die Klasse von welcher die Methode aufgerufen wird darstellt.
|
||||||
|
@ -1,38 +1,24 @@
|
|||||||
package de.dhbwstuttgart.typeinference;
|
package de.dhbwstuttgart.typeinference;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import org.apache.bcel.generic.ClassGen;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
|
||||||
public class ByteCodeResult{
|
public class ByteCodeResult{
|
||||||
|
|
||||||
private String byteCode = "";
|
private ClassGen byteCode;
|
||||||
//TODO: unresolvedTPHs entfernen. BROKEN!
|
//TODO: unresolvedTPHs entfernen. BROKEN!
|
||||||
private Menge<TypePlaceholder> unresolvedTPHs = new Menge<TypePlaceholder>();
|
private Menge<TypePlaceholder> unresolvedTPHs = new Menge<TypePlaceholder>();
|
||||||
|
|
||||||
public ByteCodeResult(){
|
public ByteCodeResult(ClassGen byteCode){
|
||||||
|
this.byteCode = byteCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ByteCodeResult(String byteCode){
|
public ClassGen getByteCode(){
|
||||||
this.byteCode += byteCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getByteCode(){
|
|
||||||
return byteCode;
|
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) {
|
public void addUnresolvedTPH(TypePlaceholder typePlaceholder) {
|
||||||
unresolvedTPHs.add(typePlaceholder);
|
unresolvedTPHs.add(typePlaceholder);
|
||||||
@ -49,7 +35,7 @@ public class ByteCodeResult{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return getByteCode();
|
return getByteCode().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,6 +13,7 @@ import plugindevelopment.TypeInsertTester;
|
|||||||
import de.dhbwstuttgart.core.MyCompiler;
|
import de.dhbwstuttgart.core.MyCompiler;
|
||||||
import de.dhbwstuttgart.core.MyCompilerAPI;
|
import de.dhbwstuttgart.core.MyCompilerAPI;
|
||||||
import de.dhbwstuttgart.logger.LoggerConfiguration;
|
import de.dhbwstuttgart.logger.LoggerConfiguration;
|
||||||
|
import de.dhbwstuttgart.logger.Section;
|
||||||
import de.dhbwstuttgart.parser.JavaParser.yyException;
|
import de.dhbwstuttgart.parser.JavaParser.yyException;
|
||||||
import de.dhbwstuttgart.typeinference.ByteCodeResult;
|
import de.dhbwstuttgart.typeinference.ByteCodeResult;
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
@ -23,16 +24,18 @@ public class EmptyClass {
|
|||||||
|
|
||||||
public final static String rootDirectory = System.getProperty("user.dir")+"/test/bytecode/";
|
public final static String rootDirectory = System.getProperty("user.dir")+"/test/bytecode/";
|
||||||
public final static String testFile = "EmptyClass.jav";
|
public final static String testFile = "EmptyClass.jav";
|
||||||
|
public final static String outputFile = "EmptyClass.class";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
LoggerConfiguration logConfig = new LoggerConfiguration();
|
LoggerConfiguration logConfig = new LoggerConfiguration().setOutput(Section.PARSER, System.out);
|
||||||
MyCompilerAPI compiler = MyCompiler.getAPI(logConfig);
|
MyCompilerAPI compiler = MyCompiler.getAPI(logConfig);
|
||||||
try {
|
try {
|
||||||
compiler.parse(new File(rootDirectory + testFile));
|
compiler.parse(new File(rootDirectory + testFile));
|
||||||
compiler.typeReconstruction();
|
//compiler.typeReconstruction();
|
||||||
ByteCodeResult bytecode = compiler.generateBytecode();
|
ByteCodeResult bytecode = compiler.generateBytecode();
|
||||||
System.out.println(bytecode);
|
System.out.println(bytecode);
|
||||||
|
bytecode.getByteCode().getJavaClass().dump(new File(rootDirectory + outputFile));
|
||||||
} catch (IOException | yyException e) {
|
} catch (IOException | yyException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
TestCase.fail();
|
TestCase.fail();
|
||||||
|
Loading…
Reference in New Issue
Block a user