BCEL Framework aktualisiert. FunN Typen implementieren

This commit is contained in:
JanUlrich 2016-04-28 15:32:12 +02:00
parent 629d2dcc4d
commit a31e7b1108
3 changed files with 5 additions and 30 deletions

Binary file not shown.

View File

@ -74,7 +74,7 @@ public class MethodGenerator extends MethodGen{
method.addAttribute(factory.createSignatureAttribute(paramTypesSig+retTypeSig));
StackMap stackMap = new StackMapTableGen(this.getInstructionList(), cp).getStackMap();
StackMap stackMap = new StackMapTableGen(this, cp).getStackMap();
if(stackMap != null)method.addCodeAttribute(stackMap);
return method.getMethod();

View File

@ -164,38 +164,13 @@ public class LambdaExpression extends Expr{
ret.add(method_body.TYPEStmt(ArgumentAssumptions.add(assumptions))); //Es gibt die LambdaExpression nur mit einem Block als Method Body, nicht mit einer einzelnen Expression
//Die Constraints ƒÂ¼r ParameterTypen und Ret Typ erstellen:
Menge<Type> modifiedParamTypes = new Menge<>();
for(Type pT : paramTypes){
if(pT instanceof WildcardType){
//Auf Typfehler kontrollieren. Siehe Bug #12 Kommentar 3
if(pT instanceof ExtendsWildcardType){
throw new TypeinferenceException("Typfehler von Parametertyp "+pT,this);
}else{
modifiedParamTypes.add(pT);
}
}else{
modifiedParamTypes.add(new SuperWildcardType((ObjectType) pT));
}
}
Type retType = method_body.getType();
// PN < TPH PN
if(retType instanceof WildcardType){
//Auf Typfehler kontrollieren. Siehe Bug #12 Kommentar 3
if(retType instanceof SuperWildcardType){
throw new TypeinferenceException("Typfehler von Parametertyp "+retType,this);
}else{
//retType bleibt unverändert
}
}else{
//Die LambdaExpression kann zu diesem Zeit schon feststellen, ob der Return-Type Void ist (Kein Return-Statement):
if(!typeIsVoid(retType)){ //Nur, wenn es nicht void ist, kann der ExtendsWildcardType gebildet werden.
retType = new ExtendsWildcardType((ObjectType) retType);
}
}
if(typeIsVoid(retType)){//In diesem Fall, muss der Typ des LambdaAusdrucks FunVoid sein
this.lambdaType = new FunVoidN(modifiedParamTypes);
this.lambdaType = new FunVoidN(paramTypes);
}else{
this.lambdaType = new FunN(retType, modifiedParamTypes);
this.lambdaType = new FunN(retType, paramTypes);
}
ret.add(ConstraintsSet.createSingleConstraint(lambdaType.TYPE(assumptions, this),this.getType().TYPE(assumptions, this)));