RFR: 8143317: jdk/lambda/vm/InterfaceAccessFlagsTest.java fails with IncompatibleClassChangeError

Yumin Qi yumin.qi at oracle.com
Fri Jan 8 18:13:40 UTC 2016


Please review

Bug: https://bugs.openjdk.java.net/browse/JDK-8143317
Weberv: http://cr.openjdk.java.net/~minqi/8143317/webrev-01/

Description: When bug 
8145148(https://bugs.openjdk.java.net/browse/JDK-8145148) pushed (it 
replaced 8087223, will be integrated), the test case 
InterfaceAccessFlagsTest.java will fail on inconsistent method tag. The 
fix of 8145148 requires that generated bytecodes follows

JVMS-5.4.3.3 Method Resolution:
  " If C is an interface, method resolution throws an 
IncompatibleClassChangeError."
JVMS-5.4.3.4 Interface Method Resolution:
  "If C is not an interface, interface method resolution throws an 
IncompatibleClassChangeError"

When converting a class to interface in 
*ClassToInterfaceConverter.java*, it only deletes "<init>" function from 
the class, and modifies the class flag to be interface flag. In this 
case, we have function "m" to call "priv" in the same class  "I", after 
conversion to interface "I", "m" invokes "priv" in the same interface 
(they are default methods). This requires "priv" in constant pool with 
tag of InterfaceMethodref, but the conversion does not change the tag to 
InterfaceMethodref (it keeps tag as Methodref).

Added code to convert the invoked Methodref to InterfaceMethodref.

Tests: JPRT, jtreg on InterfaceAccessFlags.java, passed for binaries for 
pre-8145148  and 8145148.

Thanks
Yumin









More information about the jdk9-dev mailing list