forked from JavaTX/JavaCompilerCore
NewStatement bytecode
This commit is contained in:
parent
a221adb28c
commit
0048d5f305
@ -32,6 +32,7 @@ public class JavaToBCEL {
|
|||||||
new BCELifier(new ClassParser(rootDirectory+"LocalVarAccess.class").parse(), new FileOutputStream(new File(rootDirectory+"LocalVarAccessCreator.java"))).start();
|
new BCELifier(new ClassParser(rootDirectory+"LocalVarAccess.class").parse(), new FileOutputStream(new File(rootDirectory+"LocalVarAccessCreator.java"))).start();
|
||||||
new BCELifier(new ClassParser(rootDirectory+"Wildcard.class").parse(), new FileOutputStream(new File(rootDirectory+"WildcardCreator.java"))).start();
|
new BCELifier(new ClassParser(rootDirectory+"Wildcard.class").parse(), new FileOutputStream(new File(rootDirectory+"WildcardCreator.java"))).start();
|
||||||
new BCELifier(new ClassParser(rootDirectory+"BooleanValue.class").parse(), new FileOutputStream(new File(rootDirectory+"BooleanValueCreator.java"))).start();
|
new BCELifier(new ClassParser(rootDirectory+"BooleanValue.class").parse(), new FileOutputStream(new File(rootDirectory+"BooleanValueCreator.java"))).start();
|
||||||
|
new BCELifier(new ClassParser(rootDirectory+"NewClass.class").parse(), new FileOutputStream(new File(rootDirectory+"NewClassCreator.java"))).start();
|
||||||
|
|
||||||
} catch (ClassFormatException | IOException e) {
|
} catch (ClassFormatException | IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -1,39 +1,26 @@
|
|||||||
// ino.module.ArgumentList.8621.package
|
|
||||||
package de.dhbwstuttgart.syntaxtree.statement;
|
package de.dhbwstuttgart.syntaxtree.statement;
|
||||||
// ino.end
|
|
||||||
// ino.module.ArgumentList.8621.import
|
|
||||||
import java.util.Iterator;
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.commons.bcel6.generic.InstructionList;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
|
import de.dhbwstuttgart.bytecode.ClassGenerator;
|
||||||
import de.dhbwstuttgart.myexception.JVMCodeException;
|
import de.dhbwstuttgart.myexception.JVMCodeException;
|
||||||
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
||||||
import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
||||||
import de.dhbwstuttgart.typeinference.ResultSet;
|
import de.dhbwstuttgart.typeinference.ResultSet;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ino.class.ArgumentList.24911.declaration
|
|
||||||
public class ArgumentList extends SyntaxTreeNode
|
public class ArgumentList extends SyntaxTreeNode
|
||||||
// ino.end
|
|
||||||
// ino.class.ArgumentList.24911.body
|
|
||||||
{
|
{
|
||||||
// ino.attribute.expr.24914.declaration
|
|
||||||
public Menge<Expr> expr = new Menge<Expr>();
|
public Menge<Expr> expr = new Menge<Expr>();
|
||||||
// ino.end
|
|
||||||
|
|
||||||
|
|
||||||
// ino.method.get_firstElement.24923.definition
|
|
||||||
public Object get_firstElement()
|
public Object get_firstElement()
|
||||||
// ino.end
|
|
||||||
// ino.method.get_firstElement.24923.body
|
|
||||||
{
|
{
|
||||||
return expr.firstElement();
|
return expr.firstElement();
|
||||||
}
|
}
|
||||||
// ino.end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andreas Stadelmeier, a10023
|
* @author Andreas Stadelmeier, a10023
|
||||||
@ -94,5 +81,21 @@ public class ArgumentList extends SyntaxTreeNode
|
|||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public InstructionList generateBytecode(ClassGenerator cg){
|
||||||
|
InstructionList ret = new InstructionList();
|
||||||
|
for(Expr e : expr){
|
||||||
|
ret.append(e.genByteCode(cg));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public org.apache.commons.bcel6.generic.Type[] getBytecodeTypeList(ClassGenerator cg){
|
||||||
|
org.apache.commons.bcel6.generic.Type[] ret = new org.apache.commons.bcel6.generic.Type[expr.size()];
|
||||||
|
int i = 0;
|
||||||
|
for(Expr e : expr){
|
||||||
|
ret[i] = e.getType().getBytecodeType(cg);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// ino.end
|
|
||||||
|
@ -6,8 +6,11 @@ import java.util.Enumeration;
|
|||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.commons.bcel6.Constants;
|
||||||
import org.apache.commons.bcel6.generic.ClassGen;
|
import org.apache.commons.bcel6.generic.ClassGen;
|
||||||
|
import org.apache.commons.bcel6.generic.InstructionConstants;
|
||||||
import org.apache.commons.bcel6.generic.InstructionList;
|
import org.apache.commons.bcel6.generic.InstructionList;
|
||||||
|
import org.apache.commons.bcel6.generic.ObjectType;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Menge;
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
import de.dhbwstuttgart.bytecode.ClassGenerator;
|
import de.dhbwstuttgart.bytecode.ClassGenerator;
|
||||||
@ -55,6 +58,7 @@ public class NewClass extends Expr
|
|||||||
|
|
||||||
// ino.attribute.arglist.25837.declaration
|
// ino.attribute.arglist.25837.declaration
|
||||||
private ArgumentList arglist;
|
private ArgumentList arglist;
|
||||||
|
private boolean isStatement = false;
|
||||||
// ino.end
|
// ino.end
|
||||||
// ino.attribute.parserlog.25840.declaration
|
// ino.attribute.parserlog.25840.declaration
|
||||||
protected static Logger parserlog = Logger.getLogger("parser");
|
protected static Logger parserlog = Logger.getLogger("parser");
|
||||||
@ -129,15 +133,7 @@ public class NewClass extends Expr
|
|||||||
//TODO: Das hier noch vervollständigen
|
//TODO: Das hier noch vervollständigen
|
||||||
ConstraintsSet ret = new ConstraintsSet();
|
ConstraintsSet ret = new ConstraintsSet();
|
||||||
UndConstraint callConstraints = new UndConstraint();
|
UndConstraint callConstraints = new UndConstraint();
|
||||||
//Die Auskommentierten Zeilen gehören zu MethodRefNew
|
|
||||||
//Menge<Type> argumentTypeList = new Menge<Type>();
|
|
||||||
//for(Expr expr : this.arglist.expr){
|
|
||||||
// argumentTypeList.add(expr.getTypeVariable());
|
|
||||||
//}
|
|
||||||
//FunN funN= new FunN(null,argumentTypeList);
|
|
||||||
|
|
||||||
//Constraint newClassTypeConstraint = new Constraint(null,null);
|
|
||||||
//ret.add(newClassTypeConstraint);
|
|
||||||
int numArgs = 0;
|
int numArgs = 0;
|
||||||
if(this.arglist != null)numArgs = this.arglist.size();
|
if(this.arglist != null)numArgs = this.arglist.size();
|
||||||
ConstructorAssumption cA = assumptions.getConstructorAssumption(this.get_Name(), numArgs);
|
ConstructorAssumption cA = assumptions.getConstructorAssumption(this.get_Name(), numArgs);
|
||||||
@ -147,22 +143,9 @@ public class NewClass extends Expr
|
|||||||
ret.add(this.arglist.expr.elementAt(i).TYPEExpr(assumptions));
|
ret.add(this.arglist.expr.elementAt(i).TYPEExpr(assumptions));
|
||||||
callConstraints.addConstraint( this.arglist.expr.elementAt(i).getType().TYPE(assumptions, this), cA.getParameterType(i).TYPE(assumptions, this));
|
callConstraints.addConstraint( this.arglist.expr.elementAt(i).getType().TYPE(assumptions, this), cA.getParameterType(i).TYPE(assumptions, this));
|
||||||
}
|
}
|
||||||
//if(this.arglist != null && this.arglist.expr != null)for(Expr arg : this.arglist.expr){
|
|
||||||
// ret.add(arg.TYPEExpr(assumptions));
|
|
||||||
//}
|
|
||||||
Type thisT = assumptions.checkType(new RefType(this.get_Name(),this,0), (SyntaxTreeNode)this);
|
Type thisT = assumptions.checkType(new RefType(this.get_Name(),this,0), (SyntaxTreeNode)this);
|
||||||
this.setType(thisT);
|
this.setType(thisT);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
//Ein new-Aufruf ist nichts anderes als ein MethodCall der Methode <init>
|
|
||||||
MethodCall newAufruf = new MethodCall(0,0);
|
|
||||||
this.setType(assumptions.getTypeFor(new RefType(this.get_Name(),0)));
|
|
||||||
newAufruf.type = this.getType();
|
|
||||||
newAufruf.set_Name("<init>");
|
|
||||||
newAufruf.set_Receiver(null);
|
|
||||||
ret.add(new Overloading(assumptions, newAufruf, this.getType()).generateConsstraints());
|
|
||||||
*/
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,6 +159,7 @@ public class NewClass extends Expr
|
|||||||
public ConstraintsSet TYPEStmt(TypeAssumptions assumptions){
|
public ConstraintsSet TYPEStmt(TypeAssumptions assumptions){
|
||||||
ConstraintsSet ret = this.TYPEExpr(assumptions); //TypeExpr aufrufen
|
ConstraintsSet ret = this.TYPEExpr(assumptions); //TypeExpr aufrufen
|
||||||
this.setType(new Void(this,0)); //Typ des Statments auf Void setzen.
|
this.setType(new Void(this,0)); //Typ des Statments auf Void setzen.
|
||||||
|
this.isStatement = true;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,8 +192,21 @@ public class NewClass extends Expr
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InstructionList genByteCode(ClassGenerator _cg) {
|
public InstructionList genByteCode(ClassGenerator _cg) {
|
||||||
// TODO Bytecode
|
InstructionList il = new InstructionList();
|
||||||
throw new NotImplementedException();
|
if(arglist!=null){
|
||||||
|
il.append(arglist.generateBytecode(_cg));
|
||||||
|
il.append(_cg.getInstructionFactory().createInvoke(this.get_Name(), "<init>",
|
||||||
|
org.apache.commons.bcel6.generic.Type.VOID,
|
||||||
|
this.arglist.getBytecodeTypeList(_cg), Constants.INVOKESPECIAL));
|
||||||
|
}else{
|
||||||
|
il.append(_cg.getInstructionFactory().createInvoke(this.get_Name(), "<init>",
|
||||||
|
org.apache.commons.bcel6.generic.Type.VOID,
|
||||||
|
new org.apache.commons.bcel6.generic.Type[]{}, Constants.INVOKESPECIAL));
|
||||||
|
}
|
||||||
|
if(this.isStatement){
|
||||||
|
il.append(InstructionConstants.POP);
|
||||||
|
}
|
||||||
|
return il;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -857,8 +857,8 @@ public class RefType extends ObjectType implements IMatchable
|
|||||||
|
|
||||||
cg.addExtraClass(generatedClass.genByteCode(new TypeinferenceResultSet(generatedClass, new Menge<>(), new ResultSet())).getByteCode());
|
cg.addExtraClass(generatedClass.genByteCode(new TypeinferenceResultSet(generatedClass, new Menge<>(), new ResultSet())).getByteCode());
|
||||||
}
|
}
|
||||||
|
String ret = new org.apache.commons.bcel6.generic.ObjectType(combinedType).getSignature();
|
||||||
return "L"+combinedType+";";
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCombinedType(ClassGenerator cg){
|
public String getCombinedType(ClassGenerator cg){
|
||||||
|
10
test/bytecode/NewStatement.jav
Normal file
10
test/bytecode/NewStatement.jav
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
class NewStatement{
|
||||||
|
public NewStatement(Integer i){}
|
||||||
|
public NewStatement(String i){}
|
||||||
|
method() {
|
||||||
|
NewStatement n;
|
||||||
|
n = new NewStatement("hallo");
|
||||||
|
n = new NewStatement(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
55
test/bytecode/NewStatementTest.java
Normal file
55
test/bytecode/NewStatementTest.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import plugindevelopment.TypeInsertTester;
|
||||||
|
import de.dhbwstuttgart.core.MyCompiler;
|
||||||
|
import de.dhbwstuttgart.core.MyCompilerAPI;
|
||||||
|
import de.dhbwstuttgart.logger.LoggerConfiguration;
|
||||||
|
import de.dhbwstuttgart.logger.Section;
|
||||||
|
import de.dhbwstuttgart.parser.JavaParser.yyException;
|
||||||
|
import de.dhbwstuttgart.typeinference.ByteCodeResult;
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
|
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
|
||||||
|
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertSet;
|
||||||
|
|
||||||
|
public class NewStatementTest {
|
||||||
|
|
||||||
|
public final static String rootDirectory = System.getProperty("user.dir")+"/test/bytecode/";
|
||||||
|
public final static String testFile = "NewStatement.jav";
|
||||||
|
public final static String outputFile = "NewStatement.class";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
SingleClassTester.compileToBytecode(rootDirectory+testFile, rootDirectory);
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void testUntypedVectorDeclaredMethods() {
|
||||||
|
try{
|
||||||
|
File file = new File(System.getProperty("user.dir")+"/test/bytecode/types/");
|
||||||
|
URL url = file.toURL();
|
||||||
|
URL[] urls = new URL[]{url};
|
||||||
|
|
||||||
|
ClassLoader classLoader = new URLClassLoader(urls);
|
||||||
|
|
||||||
|
Class untypedVectorTest = classLoader.loadClass("UntypedVector");
|
||||||
|
|
||||||
|
for(Method method: untypedVectorTest.getDeclaredMethods()){
|
||||||
|
System.out.println(method.toGenericString());
|
||||||
|
}
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
6
test/bytecode/Test2.java
Normal file
6
test/bytecode/Test2.java
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
class Test2{
|
||||||
|
|
||||||
|
public static void main(java.lang.String[] args){
|
||||||
|
new NewStatement(1).method();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user