diff -r 6a218ef2c3e6 src/vm/runtime/defmeth/ConflictingDefaultsTest.java --- a/src/vm/runtime/defmeth/ConflictingDefaultsTest.java Wed Jan 20 14:59:47 2016 +0300 +++ b/src/vm/runtime/defmeth/ConflictingDefaultsTest.java Fri Jan 29 10:06:03 2016 -0800 @@ -342,7 +342,7 @@ ConcreteClass A = b.clazz("A").implement(J,I) .concreteMethod("test_Amethod_ISIMR", "()V") .invoke(SPECIAL, b.clazzByName("J"), b.clazzByName("A"), - "m", "()I", CALLSITE) + "m", "()I", INTERFACEMETHODREF) .build() .build(); @@ -354,7 +354,7 @@ .build(); Class expectedError1, expectedError2; - if (factory.getVer() > 49) { + if (factory.getVer() >=52) { expectedError1 = expectedError2 = AbstractMethodError.class; } else { expectedError1 = expectedError2 = VerifyError.class; diff -r 6a218ef2c3e6 src/vm/runtime/defmeth/DefaultVsAbstractTest.java --- a/src/vm/runtime/defmeth/DefaultVsAbstractTest.java Wed Jan 20 14:59:47 2016 +0300 +++ b/src/vm/runtime/defmeth/DefaultVsAbstractTest.java Fri Jan 29 10:06:03 2016 -0800 @@ -446,20 +446,11 @@ String exeMode = factory.getExecutionMode(); - Class expectedError; // ICCE in direct mode due to // JVMS-5.4.3.4. Interface Method Resolution // When resolving an interface method reference: // If C is not an interface, interface method resolution throws an IncompatibleClassChangeError. - if (exeMode.equals("DIRECT")) { - expectedError = IncompatibleClassChangeError.class; - } else if (exeMode.equals("REFLECTION") || exeMode.equals("INVOKE_WITH_ARGS")) { - expectedError = AbstractMethodError.class; - } else { - // IAE is the expected error for invoke modes - - // INVOKE_EXACT, INVOKE_GENERIC, and INDY - expectedError = IllegalAccessError.class; - } + Class expectedError = IncompatibleClassChangeError.class;; b.test().interfaceCallSite(A, B, "m", "()I") .throws_(expectedError).done() @@ -469,11 +460,11 @@ /* * interface I { - * abstract public int m(); + * public int m() default { return 1; } * } * * interface J { - * abstract public int m(); + * public int m() default { return 1; } * } * * class A implements I; @@ -481,8 +472,7 @@ * class B extends A implements J; * * TEST: A o = new B(); o.m()I - * ICCE for DIRECT, REFLECTION and INVOKE_WITH_ARGS modes - * IAE for other modes + * ICCE for all modes */ public void testInvokeInterfaceMultipleDefinedClassDefaultMethod() { TestBuilder b = factory.getBuilder(); @@ -506,11 +496,6 @@ // When resolving an interface method reference: // If C is not an interface, interface method resolution throws an IncompatibleClassChangeError. Class expectedError = IncompatibleClassChangeError.class; - if (exeMode.equals("INVOKE_EXACT") || - exeMode.equals("INVOKE_GENERIC") || - exeMode.equals("INDY")) { - expectedError = IllegalAccessError.class; - } b.test().interfaceCallSite(A, B, "m", "()I") .throws_(expectedError).done() diff -r 6a218ef2c3e6 src/vm/runtime/defmeth/shared/ClassFileGenerator.java --- a/src/vm/runtime/defmeth/shared/ClassFileGenerator.java Wed Jan 20 14:59:47 2016 +0300 +++ b/src/vm/runtime/defmeth/shared/ClassFileGenerator.java Fri Jan 29 10:06:03 2016 -0800 @@ -302,11 +302,16 @@ } private static Handle convertToHandle(CallMethod callSite) { + // decide if generate interface handle + boolean itf = (callSite.generateIndexbyteOp() == CallMethod.IndexbyteOp.INTERFACEMETHODREF) || + (callSite.staticClass() instanceof Interface) || + (callSite.invokeInsn() == CallMethod.Invoke.INTERFACE); return new Handle( - /* tag */ callSite.invokeInsn().tag(), + /* tag */ callSite.invokeInsn().tag(), /* owner */ callSite.staticClass().intlName(), - /* name */ callSite.methodName(), - /* desc */ callSite.methodDesc()); + /* name */ callSite.methodName(), + /* desc */ callSite.methodDesc(), + /* intfs */ itf); } private Handle generateBootstrapMethod(CallMethod callSite) {