[JDK8] RFR (XS): JSR292: IncompatibleClassChangeError in LambdaForm for CharSequence.toString() method handle type converter (original) (raw)

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed Jan 15 07:31:04 PST 2014


http://cr.openjdk.java.net/~vlivanov/8031502/webrev.00/ https://bugs.openjdk.java.net/browse/JDK-8031502

InvokeBytecodeGenerator can produce incorrect bytecode for a LambdaForm when invoking a method from Object declared in an interface.

The problem is the following: (1) java.lang.CharSequence interface declares abstract method "String toString()";

(2) after 8014013 fix, VM resolves CharSequence::toString()/invokeInterface to CharSequence::toString()/invokeVirtual;

(3) during LambdaForm compilation, CharSequence is considered statically invocable (see InvokeBytecodeGenerator::isStaticallyInvocable) and invokevirtual for CharSequence::toString() is issued, which is wrong (invokevirtual throws ICCE if it references an interface);

The fix is straightforward: during LambdaForm compilation, switch back from invokevirtual to invokeinterface instruction when invoking a method on an interface.

The fix is targeted for 8. Will be also integrated into 9.

Testing: regression test, jdk/test/java/lang/invoke, vm.mlvm.testlist, nashorn, jruby.

Thanks!

Best regards, Vladimir Ivanov



More information about the hotspot-compiler-dev mailing list