From 69706ee1d22b043515bf81cff1dbd29577605daf Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Tue, 3 Jul 2018 11:15:58 +0200 Subject: [PATCH] Bug 82 gefixt und getestet. Descriptor von MethodCall von Interface korrigiert. --- src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java | 4 ++-- .../bytecode/descriptor/DescriptorToString.java | 4 ++-- .../bytecode/utilities/MethodFromMethodCall.java | 11 +++++++++-- test/bytecode/javFiles/Lambda.jav | 4 ++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index b5486df7..6b6cab17 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -658,13 +658,13 @@ public class BytecodeGenMethod implements StatementVisitor { methodCall.arglist.accept(this); MethodFromMethodCall method = new MethodFromMethodCall(methodCall.arglist, methodCall.getType(), - genericsAndBoundsMethod, genericsAndBounds); + receiverName, genericsAndBoundsMethod, genericsAndBounds); String mDesc = method.accept(new DescriptorToString(resultSet)); System.out.println("Methodcall Desc : " + mDesc); // is methodCall.receiver functional Interface)? if (varsFunInterface.contains(methodCall.receiver.getType())) { mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, getResolvedType(methodCall.receiver.getType()), methodCall.name, - mDesc, false); + mDesc, true); } else { mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getResolvedType(methodCall.receiver.getType()), methodCall.name, mDesc, isInterface); diff --git a/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java index 2b9bb931..d92efe5a 100644 --- a/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java +++ b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java @@ -172,7 +172,7 @@ public class DescriptorToString implements DescriptorVisitor{ for(Expression e : methodFromMethodCall.getArgList().getArguments()) { String d = resultSet.resolveType(e.getType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(d.substring(0, 4).equals("TPH ") ||d.contains("<")) { + if(d.substring(0, 4).equals("TPH ") ||d.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")) { desc += "L"+Type.getInternalName(Object.class)+ ";"; }else { if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(d)) { @@ -189,7 +189,7 @@ public class DescriptorToString implements DescriptorVisitor{ System.out.println("DescriptorToString retType = " + retType); if(retType.equals("void")) { desc += ")V"; - }else if(retType.substring(0, 4).equals("TPH ")|| retType.contains("<")){ + }else if(retType.substring(0, 4).equals("TPH ")|| retType.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")){ desc += ")L"+Type.getInternalName(Object.class)+ ";"; }else { if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(retType)) { diff --git a/src/de/dhbwstuttgart/bytecode/utilities/MethodFromMethodCall.java b/src/de/dhbwstuttgart/bytecode/utilities/MethodFromMethodCall.java index cd8f5372..2028c772 100644 --- a/src/de/dhbwstuttgart/bytecode/utilities/MethodFromMethodCall.java +++ b/src/de/dhbwstuttgart/bytecode/utilities/MethodFromMethodCall.java @@ -9,13 +9,16 @@ import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; public class MethodFromMethodCall { private ArgumentList argList; private RefTypeOrTPHOrWildcardOrGeneric returnType; + private String receiverName; private HashMap genericsAndBoundsMethod; private HashMap genericsAndBounds; - public MethodFromMethodCall(ArgumentList argList,RefTypeOrTPHOrWildcardOrGeneric returnType, - HashMap genericsAndBoundsMethod,HashMap genericsAndBounds) { + public MethodFromMethodCall(ArgumentList argList,RefTypeOrTPHOrWildcardOrGeneric returnType, + String receiverName, HashMap genericsAndBoundsMethod, + HashMap genericsAndBounds) { this.argList = argList; this.returnType = returnType; + this.receiverName = receiverName; this.genericsAndBoundsMethod = genericsAndBoundsMethod; this.genericsAndBounds = genericsAndBounds; } @@ -28,6 +31,10 @@ public class MethodFromMethodCall { return returnType; } + public String getReceiverName() { + return receiverName; + } + public HashMap getGenericsAndBoundsMethod(){ return genericsAndBoundsMethod; } diff --git a/test/bytecode/javFiles/Lambda.jav b/test/bytecode/javFiles/Lambda.jav index 620440cd..e23ffa45 100644 --- a/test/bytecode/javFiles/Lambda.jav +++ b/test/bytecode/javFiles/Lambda.jav @@ -7,8 +7,8 @@ public class Lambda { var lam1 = (x) -> { return x; }; -// return lam1.apply(new Apply()); - return lam1; + return lam1.apply(new Apply()); +// return lam1; // return new Vector(); } }