# HG changeset patch # User Josef Eisl # Date 1415274028 -3600 # Node ID 6b8bceeecb309c7fa3f8dc8708117ecdf177af96 # Parent a968fd429ee5e81efb363bf3cb8e9ba9f565e682 MethodCallTargetNode: also simplify default method calls to virtual calls if possible. diff -r a968fd429ee5 -r 6b8bceeecb30 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Sun Nov 09 16:33:40 2014 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Thu Nov 06 12:40:28 2014 +0100 @@ -150,12 +150,15 @@ } } ResolvedJavaType declaredReceiverType = targetMethod().getDeclaringClass(); - if (declaredReceiverType.isInterface()) { + /* + * We need to check the invoke kind to avoid recursive simplification for default + * methods calls. + */ + if (declaredReceiverType.isInterface() && !invokeKind().equals(InvokeKind.Virtual)) { ResolvedJavaType singleImplementor = declaredReceiverType.getSingleImplementor(); if (singleImplementor != null && !singleImplementor.equals(declaredReceiverType)) { ResolvedJavaMethod singleImplementorMethod = singleImplementor.resolveMethod(targetMethod(), invoke().getContextType(), true); - // TODO (je): we can not yet deal with default methods - if (singleImplementorMethod != null && !singleImplementorMethod.isDefault()) { + if (singleImplementorMethod != null) { LogicNode condition = graph().unique(InstanceOfNode.create(singleImplementor, receiver, getProfile())); assert graph().getGuardsStage().ordinal() < StructuredGraph.GuardsStage.FIXED_DEOPTS.ordinal() : "Graph already fixed!"; GuardNode guard = graph().unique(